R在一列中找到重复项并在第二列中折叠

时间:2012-08-21 12:26:30

标签: r duplicates aggregate

我有一个数据框,其中两列接触字符串。在一列(名为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=" ")

但我不确定如何在整个数据框中提取探测列中重复项的索引。任何想法?

提前致谢

2 个答案:

答案 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=" ")如果你喜欢它是一个字符串。