前言
合并数据框有重复匹配时通常会返回所有的匹配,如何只保留匹配的第一行呢?其实这个需求也很常见。如芯片探针ID和基因ID往往多对一,要合并ID对应矩阵和芯片表达矩阵时。
数据例子
data = data.frame(id = c(1,2,3,4,5),
state = c(“KS”,“MN”,“AL”,“FL”,“CA”))
scores = data.frame(id = c(1,1,1,2,2,3,3,3),
score = c(66,75,78,86,85,76,75,90))
方法1
require(data.table)
setDT(scores); setDT(data) # convert to data.tables by reference
scores[data, mult = “first”, on = “id”, nomatch=0L]
#注意两者顺序
data[scores, mult = “first”, on = “id”, nomatch=0L] #达不到要求
方法2
merge(data, aggregate(score ~ id, data=scores, head, 1), by=“id”)
方法3
merge(data, scores[!duplicated(scores$id),], by=“id”)
方法4
#Return also those which found no match
tt <- cbind(data, score=scores[match(data
i
d
,
s
c
o
r
e
s
id, scores
id,scoresid),“score”])
#Return only those which found a match
tt[!is.na(tt$score),]
总结
个人最钟意第一种方法,因为data.table真的适合处理大数据,相比于join和merge等快了不少,几千万个基因探针我用join处理的话要很久很久,而且占的内存超级大。data.table几分钟就处理完了。
不过data.table的语法感觉怪怪的,所以一直没去学,看来要好好学习一下了。
本文来自博客园,作者:Bioinfarmer,转载请注明原文链接:https://www.cnblogs.com/jessepeng/p/11072533.html。若要及时了解动态信息,请关注同名微信公众号:Bioinfarmer。