在R中合并重复行并添加包含重复项ID的新列

10

我有一个数据框,长这样:

Chr start   stop    ref alt Hom/het ID  
chr1    5179574 5183384 ref Del Het 719  
chr1    5179574 5184738 ref Del Het 915  
chr1    5179574 5184738 ref Del Het 951  
chr1    5336806 5358384 ref Del Het 376  
chr1    5347979 5358384 ref Del Het 228  

我想合并任何重复的行,将最后一个ID列组合起来,以便所有的ID都在一行/一列中,就像这样:

Chr start   stop    ref alt Hom/het ID  
chr1    5179574 5183384 ref Del Het 719  
chr1    5179574 5184738 ref Del Het 915, 951 
chr1    5336806 5358384 ref Del Het 376  
chr1    5347979 5358384 ref Del Het 228  

我发现有人在去重并求和一列的值上做出了例子,但我只想把所有具有重复地区的ID组合成一个列表放在单独一列中。


尽管它从相同的位置开始,但第一个序列似乎不是接下来的两个序列的重复,因为它稍微长一些。您能否澄清在这种情况下您所定义的“重复”是什么? - MattLBeck
抱歉,我没有仔细查看我的示例,犯了错误。重复项将在所有列中与ID列除外完全匹配。 - user1967407
1个回答

12

可以尝试调用aggregate()函数来解决问题。

以下是一种将ID收集到列表对象中的选项:

(df1 <- aggregate(df[7], df[-7], unique))
#   Chr   start    stop ref alt Hom.het       ID
# 1 chr1 5179574 5183384 ref Del     Het      719
# 2 chr1 5179574 5184738 ref Del     Het 915, 951
# 3 chr1 5336806 5358384 ref Del     Het      376
# 4 chr1 5347979 5358384 ref Del     Het      228

这里有一个将它们收集到字符向量中的示例:

df2 <- aggregate(df[7], df[-7], 
                 FUN = function(X) paste(unique(X), collapse=", "))

比较这两个选项的结果:

str(df1$ID)
# List of 4
#  $ 0: int 719
#  $ 3: int [1:2] 915 951
#  $ 7: int 376
#  $ 8: int 228

str(df2$ID)
# chr [1:4] "719" "915, 951" "376" "228"

1
+1 或许需要指出的是,ID 变成了一个列表,而不是原子向量? - Matthew Plourde
谢谢,两个都很好用,我认为最后一个最适合我的需求。 - user1967407
谢谢@MatthewPlourde,我刚做完。 - Josh O'Brien

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接