我有一个数据框(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],""))
答案 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