2015-06-10 31 views
1

我有2个dataframes在R,一个与启动(列1)和端部之间的数据求和(第2列)坐标...- [R 2个比较DFS到值

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中它是缓慢的,而不是最好的办法。

这样做的最好方法是什么?除了简单地总结数据之外,还可以适应其他功能的灵活解决方案,这一点很有用。

回答

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功能,然后在df1


聚集的V2匹配值从df2通过所需的列数据

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

感谢那些很好地工作。我必须更新R,因为setDT不适用于版本2.15。我花了一段时间才发现第5行的错误:sum(i.V2)应该是sum(V2)。作为这个问题的一个扩展,如果df1有更多的列,并且需要保留这些列,并且,如果总计为零的行也需要保留,那么您将如何执行此操作? –

+0

是的,我假设你正在使用这个十年的R版本:)。 'i.V2'也不是错误。除此之外,如果您将使您的示例具有更高的可重现性,并且实际的列名和值不匹配,并且您希望的输出,则会更容易。 –

+0

有趣的是,当使用这里的例子时,它给了我错误“object”i.V2'not found“。当我删除“我”。一切正常。你能解释更多吗? –