【问题标题】:R finding duplicates in one column and collapsing in a second columnR在一列中查找重复项并在第二列中折叠
【发布时间】:2012-08-16 19:06:09
【问题描述】:

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

显然对于使用 which 的单个探针执行此操作没有问题,然后粘贴和折叠

ind<-which(olap$probes=="cg00061679")
genename<-(olap[ind,2])
genecomb<-paste(genename[1:length(genename)], collapse=" ")

但我不确定如何在整个数据帧中提取探针列中重复项的索引。有什么想法吗?

提前致谢

【问题讨论】:

标签: r duplicates aggregate


【解决方案1】:

您可以在基础 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)

以防万一 unique 以与tapply 不同的顺序提供探针。我个人会一直使用ddply

【讨论】:

    【解决方案2】:

    Base 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=" ") 用作字符,也可以尝试使用它字符串。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-12-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-09-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多