我有一个数据框,其中两列接触字符串。在一列(名为probes
)中我有重复的案例(即几个具有相同字符串的案例)。对于探测器中的每个案例,我想找到包含相同字符串的所有案例,然后将第二列(名为genes
)中所有相应案例的值合并为一个案例。
例如,如果我有这个结构:
probes genes
1 cg00050873 TSPY4
2 cg00061679 DAZ1
3 cg00061679 DAZ4
4 cg00061679 DAZ4
我想将其更改为此结构:
probes genes
1 cg00050873 TSPY4
2 cg00061679 DAZ1 DAZ4 DAZ4
对于单个探针使用哪个,然后粘贴并折叠
,显然没有问题ind<-which(olap$probes=="cg00061679")
genename<-(olap[ind,2])
genecomb<-paste(genename[1:length(genename)], collapse=" ")
但我不确定如何在整个数据框中提取探测列中重复项的索引。任何想法?
提前致谢
答案 0 :(得分:4)
您可以在基础R中使用tapply
data.frame(probes=unique(olap$probes),
genes=tapply(olap$genes, olap$probes, paste, collapse=" "))
或使用plyr:
library(plyr)
ddply(olap, "probes", summarize, genes = paste(genes, collapse=" "))
<强>更新强>
在第一个版本中执行此操作可能更安全:
tmp <- tapply(olap$genes, olap$probes, paste, collapse=" ")
data.frame(probes=names(tmp), genes=tmp)
以防唯一性为探针提供与tapply
不同的顺序。我个人总是使用ddply
。
答案 1 :(得分:3)
基础R aggregate()
应该可以正常工作:
aggregate(genes ~ probes, data = olap, as.vector)
# probes genes
# 1 cg00050873 TSPY4
# 2 cg00061679 DAZ1, DAZ4, DAZ4
如果我需要对数据进行任何进一步处理,我更喜欢as.vector
(这会将genes
列存储为list
,但您也可以尝试aggregate(genes ~ probes, data=test, paste, collapse=" ")
如果你喜欢它是一个字符串。