如何计算数据帧中的总字符出现次数并使用R中的mutate添加列

时间:2016-03-24 19:57:46

标签: r dplyr

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

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],""))

2 个答案:

答案 0 :(得分:2)

这是使用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    

答案 1 :(得分:0)

它有点大,但您可以使用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