假设我有两个具有以下一般结构的数据框架:
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个条目,脚本运行了几个小时。
所以,我的问题是:对于一些真正有效的代码,有人有一个聪明的想法吗?
发布于 2015-05-27 13:12:54
这应该会让你开始:
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有些细节可能还需要调整,但它们使问题对我的品味来说太宽泛了,合并的一般想法应该能帮助你向前迈进。
https://stackoverflow.com/questions/30482946
复制相似问题