首页 > 解决方案 > R:有效地计算值子集的摘要,其内容由两个变量之间的关系决定

问题描述

我有两张桌子,AB。对于表的每一行A,我想获得一些关于B$value的值在哪里的B$location汇总100统计信息A$location。我已经使用下面的 for 循环完成了这项工作,但这是一个缓慢的解决方案,当表很小时效果很好,但我想扩大到一个A有数千行的表和一个B接近数百万行的表行。关于如何实现这一目标的任何想法?提前致谢!

for循环:

for (i in 1:nrow(A)) {    
   subset(B, abs(A$location[i] - B$location) <= 100) -> temp
   A$n[i] <- nrow(temp)
   A$sum[i] <- sum(temp$value)
   A$avg[i] <- mean(temp$value)
}    

一个例子:
A loc 150 250 400
B loc value 25 7 77 19 170 10 320 15

会成为:
A loc n sum avg 150 2 29 14.5 250 2 25 12.5 400 1 15 15

标签: rfor-loopdataframedata.tablecoding-efficiency

解决方案


类似于 Matt Summersgill 的回答,你可以做一个非 equi join 来更新A

A[, up := loc + 100]
A[, dn := loc - 100]
A[, c("n", "s", "m") := 
  B[copy(.SD), on=.(loc >= dn, loc <= up), .(.N, sum(value), mean(value)), by=.EACHI][, .(N, V2, V3)]
]

或者在一个链式命令中:

A[, up := loc + 100][, dn := loc - 100][, c("n", "s", "m") := 
  B[copy(.SD), on=.(loc >= dn, loc <= up), 
    .(.N, sum(value), mean(value)), by=.EACHI][, 
    .(N, V2, V3)]
]

我猜这应该是相当有效的。

这个怎么运作

内部jx[i, j],.SD指的是来自的数据子集x(在本例中是 的全部A)。

x[i, on=, j, by=.EACHI]是一个连接,使用i(在这种情况下copy(.SD)== A) 的每一行来查找x(在这种情况下B) 的匹配行,使用on=. 对于 的每一行ij都会计算(这是什么by=.EACHI意思)。

j没有名称时,它们会自动分配。V1, V2, 等等。.N默认情况下被命名为N.


推荐阅读