假设我有两个具有以下一般结构的数据框:
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:
到目前为止,使用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个条目,脚本运行了几个小时。
所以,我的问题是:有没有人对一些非常有效的代码有一个明智的想法?
答案 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
某些细节可能仍需要调整,但它们使我的口味问题过于宽泛,合并的一般想法应该有助于你向前发展。