r - R:有效地计算值子集的摘要,其内容由两个变量之间的关系决定
问题描述
我有两张桌子,A
和B
。对于表的每一行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
解决方案
类似于 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)]
]
我猜这应该是相当有效的。
这个怎么运作
内部j
的x[i, j]
,.SD
指的是来自的数据子集x
(在本例中是 的全部A
)。
x[i, on=, j, by=.EACHI]
是一个连接,使用i
(在这种情况下copy(.SD)
== A
) 的每一行来查找x
(在这种情况下B
) 的匹配行,使用on=
. 对于 的每一行i
,j
都会计算(这是什么by=.EACHI
意思)。
当j
没有名称时,它们会自动分配。V1
, V2
, 等等。.N
默认情况下被命名为N
.
推荐阅读
- node.js - TypeOrm 和 MongoDB:插入/保存时忽略列别名
- github - 访问 Github 工作流的工件
- html - 如何使文本与文本输入字段的左上角对齐?
- openstack - 使用 qcow2 映像时无法创建 Cinder 卷。Openstack/Packstack
- javascript - 如何在按钮内的 onClick 中使用以便在 React 中传递变量
- c++ - 使用lambda时的c ++模板成员函数实例化
- python - 每天发送和接收短信(Python)
- android - 使用线圈加载图像时显示进度条?
- sql - SQL [Tidyquery in R] - 如何添加 BETWEEN 日期以及现有的 AND 条件?
- asp.net - Application Insights 服务无法从本地服务器获取指标