按时间间隔从一个数据帧聚合另一个数据帧

教育部

我正在尝试汇总两个数据帧(df1df2)。

第一个包含3个变量:IDDate1Date2

df1

ID      Date1      Date2
 1 2016-03-01 2016-04-01
 1 2016-04-01 2016-05-01
 2 2016-03-14 2016-04-15
 2 2016-04-15 2016-05-17
 3 2016-05-01 2016-06-10
 3 2016-06-10 2016-07-15

第二个还包含3个变量:IDDate3Value

df2

ID      Date3 Value
 1 2016-03-15     5
 1 2016-04-04     7
 1 2016-04-28     7
 2 2016-03-18     3
 2 2016-03-27     5
 2 2016-04-08     9
 2 2016-04-20     2
 3 2016-05-05     6
 3 2016-05-25     8
 3 2016-06-13     3

这个想法是让每一df1行的总和df2$Value都相同,ID并且Date3介于Date1之间Date2

ID      Date1      Date2 SumValue
 1 2016-03-01 2016-04-01        5
 1 2016-04-01 2016-05-01       14
 2 2016-03-14 2016-04-15       17
 2 2016-04-15 2016-05-17        2
 3 2016-05-01 2016-06-10       14
 3 2016-06-10 2016-07-15        3

我知道如何对此进行循环,但是数据帧很大!有人有有效的解决方案吗?探索data.tableplyr并且dplyr也没有找到一个解决方案。

SymbolixAU

几个data.table应该可以很好扩展解决方案(以及一个很好的权宜之计,直到实现非等额联接):

使用进行J中的比较by=EACHI

library(data.table)
setDT(df1)
setDT(df2)

df1[, `:=`(Date1 = as.Date(Date1), Date2 = as.Date(Date2))]
df2[, Date3 := as.Date(Date3)]

df1[  df2,
      {
        idx = Date1 <= i.Date3 & i.Date3 <= Date2
        .(Date1 = Date1[idx],
          Date2 = Date2[idx],
          Date3 = i.Date3,
          Value = i.Value)
      }, 
      on=c("ID"),
      by=.EACHI][, .(sumValue = sum(Value)), by=.(ID, Date1, Date2)]

#   ID      Date1      Date2 sumValue
# 1:  1 2016-03-01 2016-04-01        5
# 2:  1 2016-04-01 2016-05-01       14
# 3:  2 2016-03-14 2016-04-15       17
# 4:  2 2016-04-15 2016-05-17        2
# 5:  3 2016-05-01 2016-06-10       14
# 6:  3 2016-06-10 2016-07-15        3

foverlap 加入(如评论中所建议)

library(data.table)
setDT(df1)
setDT(df2)

df1[, `:=`(Date1 = as.Date(Date1), Date2 = as.Date(Date2))]
df2[, Date3 := as.Date(Date3)]

df2[, Date4 := Date3]


setkey(df1, ID, Date1, Date2)


foverlaps(df2,
          df1,
          by.x=c("ID", "Date3", "Date4"),
          type="within")[, .(sumValue = sum(Value)), by=.(ID, Date1, Date2)]

#     ID      Date1      Date2 sumValue
# 1:  1 2016-03-01 2016-04-01        5
# 2:  1 2016-04-01 2016-05-01       14
# 3:  2 2016-03-14 2016-04-15       17
# 4:  2 2016-04-15 2016-05-17        2
# 5:  3 2016-05-01 2016-06-10       14
# 6:  3 2016-06-10 2016-07-15        3

进一步阅读

使用重复键在data.table上滚动联接

foverlap加入data.table

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

从一个数据帧到另一个数据帧的数据表操作

如何计算从一个数据帧到另一个数据帧的单词?

将数据从一个数据帧拖入另一个

如何基于另一个数据帧中的时间间隔在一个数据帧中添加新列

将单词从一个数据帧匹配到另一个

将值从一个数据帧替换为另一个

每个时间间隔拆分一个数据帧

熊猫:将日期时间线从一个数据帧插入另一个数据帧

根据另一个数据帧的“时间戳”和“id”从一个数据帧中获取最大数量

根据另一个数据帧中的时间范围过滤数据帧

从另一个数据帧获取数据

如何从另一个重复的数据帧更新一个数据帧

另一个数据帧更新数据帧的最后一个元素

从一个数据帧中取出列,并使用“isin()”函数根据两个数据帧之间类似的“日期时间”将它们与另一个数据帧连接起来

将数据从一个数据帧复制到另一个数据帧,然后根据值替换数据

从一个数据帧中选择行,其中两个元素在另一个数据帧的一行中匹配

如何从循环中的另一个数据帧创建多个数据帧

比较两个数据帧并保留另一个数据帧的特定日期时间范围

R:有条件地将数据从一个数据帧提取到另一个数据帧

如何使用熊猫转置将数据从一个数据帧添加到另一个数据帧?

Python Pandas:将数据从一个数据帧转换为另一个数据帧

将数据从一个数据帧转移到另一个数据帧..... 基本 R 编程。

使用新字段和现有字段将数据从一个数据帧映射到另一个数据帧

R 从一个数据帧到另一个数据帧进行 n 个观察(处理存在较少观察的情况)

在 R 中,每隔 n 个值从一个数据帧插入到另一个数据帧

根据R中的两个匹配条件,将值从一个数据帧添加到另一个数据帧

通过将一个数据帧的列与另一个数据帧的行相乘来获取一个数据帧

将一个数据帧乘以另一个数据帧中的每一行并聚合结果

一种快速方法,可从一个数据帧中的另一个数据帧中查找元素并返回其索引