【发布时间】: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')))})))