比较大数据帧中的匹配条目

时间:2015-05-27 12:48:18

标签: r

假设我有两个具有以下一般结构的数据框:

A=data.frame(ID=c(1,1,2,3,6, 10), Obs=c(0,5,6,7,3,-4))
B=data.frame(ID=c(1,3,2,4,8), Obs=c(10,-5,NA,7,NA))

对于我要报告的匹配ID:

  • A中的条目,即B中的NA,或
  • “Obs”列上的符号翻转的条目。
然而,有一些并发症:

  • 有些ID不是唯一的。它们也没有订购。
  • 并非所有ID都存在于两个数据帧中,并且数据帧的长度不同。
  • 如果ID不是唯一的,那么Obs。在该行为0时,应该对具有非零obs的行进行比较。
  • 有些参赛作品是NA。

到目前为止,使用R,我使用循环和IF语句解析数据帧。例如。我的一些代码看起来像这样:

results.signflip <- data.frame()
results.missingvalue <- data.frame()
Intersection.ID<- intersect(A$ID, B$ID)

for (idx.row in 1:length(Intersection.ID)) {
 idx.selection.A   <- grep(paste0("^", Intersection.ID[idx.row]), A$ID)
 idx.selection.B   <- grep(paste0("^", Intersection.ID[idx.row]), B$ID)

 if ( sign(!A[idx.row, "Obs"] == sign(B[idx.row, "Obs"] )) 
   results.signflip <- rbind(results.signflip, A[idx.row,])

 (... more IF statements...)

}

这显然是一种解决此问题的简单而不是非常有效的方法。麻烦的是,该文件有70.000个条目,脚本运行了几个小时。

所以,我的问题是:有没有人对一些非常有效的代码有一个明智的想法?

1 个答案:

答案 0 :(得分:3)

这应该让你开始:

C <- merge(A, B, by = "ID")
C$switch <- sign(C$Obs.x * C$Obs.y)
aggregate(switch ~ ID, C[C$switch != 0 | is.na(C$switch),], head, n = 1, na.action = identity)
#  ID switch
#1  1      1
#2  2     NA
#3  3     -1

某些细节可能仍需要调整,但它们使我的口味问题过于宽泛,合并的一般想法应该有助于你向前发展。