首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >R在一列中查找重复项,并在第二列中折叠

R在一列中查找重复项,并在第二列中折叠
EN

Stack Overflow用户
提问于 2012-08-21 20:26:30
回答 2查看 2.3K关注 0票数 2

我有一个数据框,它有两列相互接触的字符串。在一个列(名为probes)中,我有重复的案例(即,具有相同字符串的多个案例)。对于探测器中的每个案例,我希望找到包含相同字符串的所有案例,然后将第二列(名为genes)中所有相应案例的值合并为一个案例。例如,如果我有这样的结构:

代码语言:javascript
复制
    probes  genes
1   cg00050873  TSPY4
2   cg00061679  DAZ1
3   cg00061679  DAZ4
4   cg00061679  DAZ4

我想把它改成这样的结构:

代码语言:javascript
复制
    probes  genes
1   cg00050873  TSPY4
2   cg00061679  DAZ1 DAZ4 DAZ4

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

代码语言:javascript
复制
ind<-which(olap$probes=="cg00061679")
genename<-(olap[ind,2])
genecomb<-paste(genename[1:length(genename)], collapse=" ")

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

提前感谢

EN

回答 2

Stack Overflow用户

发布于 2012-08-21 20:33:26

可以在base R中使用tapply

代码语言:javascript
复制
data.frame(probes=unique(olap$probes), 
           genes=tapply(olap$genes, olap$probes, paste, collapse=" "))

或者使用plyr:

代码语言:javascript
复制
library(plyr)
ddply(olap, "probes", summarize, genes = paste(genes, collapse=" "))

更新

在第一个版本中这样做可能更安全:

代码语言:javascript
复制
tmp <- tapply(olap$genes, olap$probes, paste, collapse=" ")
data.frame(probes=names(tmp), genes=tmp)

为了以防万一,unique以不同于tapply的顺序给出了探测。就我个人而言,我总是使用ddply

票数 4
EN

Stack Overflow用户

发布于 2012-08-21 21:09:00

Base R aggregate()应该可以很好地执行以下操作:

代码语言:javascript
复制
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=" ")

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12054816

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档