【问题标题】:How to count total character occurence in data frame and add column using mutate in R如何计算数据框中的总字符出现次数并在 R 中使用 mutate 添加列
【发布时间】:2016-03-24 19:57:46
【问题描述】:

我有一个数据框 (dat),其中有一列具有序列 (Seq)(字符类)。我正在尝试拆分每一行中的序列并计算'A''C''G''T' 的数量,并使用变异添加每一列(在dplyr 中)。下面是我正在尝试的示例数据框和代码。

   Seq
CAGGACATAA
TGTCCACTGC

我正在尝试执行的代码:

count_bases <- function (x){
    for(i in 1:length(x)){
        tab[i] <- table(strsplit((x)[i],""))
    }
    return(tab)
}
count_bases(dat$Seq)

如果我只将命令用于第一行:table(strsplit(dat$Seq[1],"")) 它可以正常工作并给我结果。我试图获得的所需输出是通过上述函数并变异以创建如下所示的数据框:

    Seq    A C G T
CAGGACATAA 5 2 2 1
TGTCCACTGC 1 4 2 3

【问题讨论】:

  • 类似do.call(rbind, lapply(dat$Seq, function(x){table(strsplit(as.character(x),""))}))?
  • cbind(dat,t(apply(dat, 1 , function(x) table(strsplit(x,""))))) 呢?
  • 感谢您的回复。我用“do.call”尝试了上面的代码并得到了这个警告“警告消息:在(函数(...,deparse.level = 1):结果的列数不是向量长度的倍数(arg 54) “我做错了什么吗?也可以调用此函数将这些列添加到现有数据框(dat)。再次感谢
  • 哦,如果您的序列之一没有每个碱基,这可能会发生。你可以重写函数来避免这种情况,但它会开始变得复杂......可能有一种更简单的方法。要收集到 data.frame,请使用 data.frame(dat, ... )
  • 您可以重新调整因子,以便在应有的位置获得零:data.frame(dat, do.call(rbind, lapply(dat$Seq, function(x){table(factor(strsplit(as.character(x),"")[[1]], levels = c('A', 'C', 'G', 'T')))})))

标签: r dplyr


【解决方案1】:

这是一个使用 dplyr 和 tidyr 的解决方案,它可以处理任意数量的任意长度/组成的序列:

library(tidyr)
library(dplyr)

dat <- data.frame(Seq = c("CAGGACATAA", "TGTCCACTGC"), 
                                      stringsAsFactors = F)

result <- dat %>% 
            # explode each seq into indvidiual 
            # characters on individual rows
            mutate(seq.split = strsplit(Seq, "")) %>%
            unnest() %>%  
            # count by each type of character in eah Seq
            group_by(Seq, seq.split) %>%
            summarise(n=n()) %>% 
            # convert to wide table format
            spread(seq.split, n)

result
Source: local data frame [2 x 5]

         Seq     A     C     G     T
       (chr) (int) (int) (int) (int)
1 CAGGACATAA     5     2     2     1
2 TGTCCACTGC     1     4     2     3    

【讨论】:

    【解决方案2】:

    它有点大,但您可以使用strsplit 进行拆分,然后在结果中使用lapply 来构建表列表(或在lapply 函数中拆分;随您喜欢)。然后,您可以使用do.call(rbind 重新组合列表,并使用data.frame 将其添加到现有的data.frame。您需要使用as.character 将任何因子转换为字符串,并使用factor 确保table 添加任何空级别。

    dat <- data.frame(Seq = c("ACGACCGGG", "CAGGACATAA", "TGTCCACTGC"))
    
    data.frame(dat, do.call(rbind, lapply(strsplit(as.character(dat$Seq), ''), function(x){
        table(factor(x, levels = c('A', 'C', 'G', 'T')))
    })))
    #          Seq A C G T
    # 1  ACGACCGGG 2 3 4 0
    # 2 CAGGACATAA 5 2 2 1
    # 3 TGTCCACTGC 1 4 2 3
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2022-11-24
      • 2021-12-29
      • 2019-04-19
      • 2021-07-30
      • 1970-01-01
      • 2021-05-01
      • 1970-01-01
      相关资源
      最近更新 更多