【问题标题】:Apply codon translation function to all elements of data.frame将密码子翻译功能应用于 data.frame 的所有元素
【发布时间】:2021-09-28 10:20:33
【问题描述】:

我有一个看起来像的 data.frame

df <- data.frame(P1 = c("ATG","GTA","GGG","GGG"), P2 = c("TGG","GAT","GGG","GCG"))

我想使用以下函数将每个 DNA 密码子转换为氨基酸(但任何翻译选项都是可行的),并输出相同的 data.frame,但使用单字母氨基酸而不是密码子:

library(Biostrings)
library(seqinr)
    translate_R <- function(x)
    {
      translate(s2c(as.character(x)))
    }

它适用于 data.frame 的各个元素

> translate_R(df[1,1])
[1] "M"

但试图将其应用于整个 data.frame 是行不通的。我错过了什么?我不明白为什么会出现错误,因为谷歌搜索如何做到这一点表明它应该可以工作。我猜缺少一些基本的东西。

> 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 

【问题讨论】:

    标签: r bioconductor


    【解决方案1】:

    您的translate_R 函数需要一个值,但它得到一个向量。您可以通过传入单个值来解决此问题。

    换句话说,使用外部apply 遍历df 的列,然后使用内部apply 遍历每列中的值。

    下面是如何使用基础 R:

    data.frame(lapply(df, function(x) sapply(x, translate_R)))
    

    这是一个带有map的tidyverse版本:

    library(tidyverse)
    
    df %>% mutate(across(everything(), ~map(., translate_R)))
    

    在这两种情况下,输出都是:

      P1 P2
    1  M  W
    2  V  D
    3  G  G
    4  G  A
    

    【讨论】:

      【解决方案2】:

      另一个潜在的 tidyverse 解决方案是使用 "rowwise" 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
      

      reprex package (v2.0.0) 于 2021 年 7 月 21 日创建

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-12-08
        • 1970-01-01
        • 2018-05-19
        • 2017-09-15
        • 2018-03-16
        • 2016-06-07
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多