我在R中有2个数据帧,一个有开始(第1列)和结束(第2列)坐标......
df1
2500 3499
3500 4499
4500 5499
5500 6499
一个有点坐标(第1列)和相关值(第2列)......
df2
2657 17
2895 33
3875 12
4448 42
5122 3
5633 65
5781 12
我想找到一个矢量化方法来对df2第2列的值求和,其中df2第1列坐标位于df1的起始和终止坐标之间。使用此数据,结果应如下所示......
df3
2500 3499 50
3500 4499 54
4500 5499 3
5500 6499 77
dfs包含100,000多行,我可以使用循环轻松实现这一点,但是在R中它很慢而且不是最好的方法。
最好的方法是什么?此外,一个灵活的解决方案可以适应其他功能,而不仅仅是简单地汇总数据将是很好的。
答案 0 :(得分:3)
这是一个可能的data.table::foverlaps
解决方案。由于您还没有指定列名称,我假设它们在两个数据集中都被称为V1
和V2
<强>解决方案强>
library(data.table)
setDT(df1)[, `:=`(start = V1, end = V2)]
setDT(df2)[, `:=`(start = V1, end = V1)]
setkey(df1, start, end)
foverlaps(df2, df1)[, list(SumV2 = sum(i.V2)), by = list(V1, V2)]
# V1 V2 SumV2
# 1: 2500 3499 50
# 2: 3500 4499 54
# 3: 4500 5499 3
# 4: 5500 6499 77
<强>解释强>
在这里,我们将两个数据集转换为data.table
个对象,并指定要重叠的start/end
值。然后,我们键入了我们想要加入的数据集。最后,我们运行了foverlaps
函数,然后将V2
的匹配值从df2
汇总到df1
数据强>
df1 <- structure(list(V1 = c(2500L, 3500L, 4500L, 5500L), V2 = c(3499L,
4499L, 5499L, 6499L)), .Names = c("V1", "V2"), class = "data.frame", row.names = c(NA,
-4L))
df2 <- structure(list(V1 = c(2657L, 2895L, 3875L, 4448L, 5122L, 5633L,
5781L), V2 = c(17L, 33L, 12L, 42L, 3L, 65L, 12L)), .Names = c("V1",
"V2"), class = "data.frame", row.names = c(NA, -7L))