R将2个dfs与值之间的数据进行比较

时间:2015-06-10 10:50:08

标签: r

我在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中它很慢而且不是最好的方法。

最好的方法是什么?此外,一个灵活的解决方案可以适应其他功能,而不仅仅是简单地汇总数据将是很好的。

1 个答案:

答案 0 :(得分:3)

这是一个可能的data.table::foverlaps解决方案。由于您还没有指定列名称,我假设它们在两个数据集中都被称为V1V2

<强>解决方案

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))