r-将密码子翻译功能应用于data.frame的所有元素



我有一个看起来像的数据帧

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(

相关内容

  • 没有找到相关文章