我有一个看起来像的数据帧
df <- data.frame(P1 = c("ATG","GTA","GGG","GGG"), P2 = c("TGG","GAT","GGG","GCG"))
我想使用以下函数将每个DNA密码子转换为一个氨基酸(但任何翻译选项都是可行的(,并输出相同的数据帧,但使用单个字母的氨基酸而不是密码子:
library(Biostrings)
library(seqinr)
translate_R <- function(x)
{
translate(s2c(as.character(x)))
}
它适用于数据的各个元素。帧
> translate_R(df[1,1])
[1] "M"
但试图将其应用于整个数据框架是行不通的。我错过了什么?我不明白为什么会出现错误,因为在谷歌上搜索如何做到这一点表明它应该有效。我想错过了一些基本的东西。
> df[] <- lapply(df, translate_R)
Error in seq.default(from = frame + 1, to = frame + l, by = 3) :
wrong sign in 'by' argument
In addition: Warning message:
In s2c(as.character(x)) :
Error in seq.default(from = frame + 1, to = frame + l, by = 3) :
wrong sign in 'by' argument
translate_R
函数需要一个值,但它得到了一个向量。您可以通过传递单个值来解决此问题。
换句话说,用外部apply
迭代df
的列,然后用内部apply
迭代每列中的值。
以下是如何使用基本R:
data.frame(lapply(df, function(x) sapply(x, translate_R)))
这里有一个带有map
:的小版本
library(tidyverse)
df %>% mutate(across(everything(), ~map(., translate_R)))
在这两种情况下,输出都是:
P1 P2
1 M W
2 V D
3 G G
4 G A
另一个潜在的tidyverse解决方案是使用;"按行";tidyverse函数:
library(tidyverse)
library(Biostrings)
library(seqinr)
translate_R <- function(x) {
translate(s2c(as.character(x)))
}
df <- data.frame(P1 = c("ATG","GTA","GGG","GGG"), P2 = c("TGG","GAT","GGG","GCG"))
df %>%
rowwise() %>%
mutate(across(everything(), ~ translate_R(.x)))
#> # A tibble: 4 x 2
#> # Rowwise:
#> P1 P2
#> <chr> <chr>
#> 1 M W
#> 2 V D
#> 3 G G
#> 4 G A
创建于2021-07-21由reprex包(v2.0.0(