首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >比较大数据帧中的匹配项

比较大数据帧中的匹配项
EN

Stack Overflow用户
提问于 2015-05-27 12:48:17
回答 1查看 96关注 0票数 1

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

代码语言:javascript
复制
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都存在于两个数据帧中,而且数据帧也不是相同的长度。
  • 如果If不是唯一的,而是Obs。在该行为0的情况下,应该使用非零项对行进行比较。
  • 有些条目是NA的。

到目前为止,使用R,我已经使用循环和IF-语句来解析数据帧。例如,我的一些代码应该如下所示:

代码语言:javascript
复制
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个条目,脚本运行了几个小时。

所以,我的问题是:对于一些真正有效的代码,有人有一个聪明的想法吗?

EN

回答 1

Stack Overflow用户

发布于 2015-05-27 13:12:54

这应该会让你开始:

代码语言:javascript
复制
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

有些细节可能还需要调整,但它们使问题对我的品味来说太宽泛了,合并的一般想法应该能帮助你向前迈进。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30482946

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档