R 计算特定范围内多个重叠事件的最大值

R 计算特定范围内多个重叠事件的最大值,r,dplyr,data.table,longitudinal,R,Dplyr,Data.table,Longitudinal,我有多个大型数据帧,用于捕获持续一定时间的事件。此示例提供了我的数据集的简化版本 数据帧1: ID Days Date Value 1 10 80 30 1 10 85 30 2 20 75 20 2 10 80 20 3 5 90 30 数据帧2: ID Days Date Value 1 20 0 30 1

我有多个大型数据帧,用于捕获持续一定时间的事件。此示例提供了我的数据集的简化版本

数据帧1:

 ID  Days  Date  Value
  1    10    80     30
  1    10    85     30
  2    20    75     20
  2    10    80     20
  3     5    90     30
数据帧2:

   ID  Days  Date  Value
    1    20     0     30
    1    10     3     20
    2    20     5     30
    3    20     1     10
    3    10    10     10
  • 相同的
    ID
    用于所有数据集中的同一个人

  • Days
    指定事件的长度(如果
    Days
    的值为10,则事件持续10天)

  • Date
    指定事件开始的日期。在这种情况下,
    Date
    可以是0到90或91之间的任何数字(数据表示季度中的天数)

  • Value
    是在指定的
    天数内重复的属性。例如,对于df1中的第一行,值
    30
    从第80天开始重复10次(30重复10天)

我感兴趣的是为每个数据帧中的每个
ID
提供每天的最高值。请记住,多个事件可能重叠,然后必须求和值

最终的数据帧应如下所示:

ID HighestValuedf1    HighestValuedf2
1               60                 80
2               40                 30
3               30                 20
例如,对于
ID
1,三个事件重叠,导致数据帧2中的最大值为80。对于
ID
3,df1和df1的事件之间没有重叠,只有与df2的重叠

由于文件的大小,我更喜欢一种避免将所有数据帧合并为一个数据帧的解决方案

编辑 我重新排列了数据,以便所有重叠的事件都在一个数据帧中。我只需要每个数据帧的最高重叠值

用于再现数据帧的代码:

ID = c(1,1,2,2,3)
Date = c(80,85,75,80,90)
Days = c(10,10,20,10,5)
Value = c(30,30,20,20,30)
df1 = data.frame(ID,Days, Date,Value)

ID = c(1,1,2,3,3)
Date = c(1,3,5,1,10)
Days = c(20,10,20,20,10 )
Value =c(30,20,30,10,10)
df2 = data.frame(ID,Days, Date,Value)

ID= c(1,2,3)
HighestValuedf1 = c(60,40,30)
HighestValuedf2 = c(80,30,20)
df3 = data.frame(ID, HighestValuedf1, HighestValuedf2)

我将每日最高值解释为整个时间段内单日最高值。这可能不是最有效的解决方案,因为我希望可以使用
map
apply
函数来完成一些事情,但我没有看到第一眼看到的效果。使用上文定义的
df1
df2

编辑:在理解df1和df2应该表示连续四分之一时修改代码。我认为最简单的方法是简单地堆叠数据帧,以便自动捕获任何重叠的内容(即df2的第1天是第91天)。由于季度长度不同,您可能需要手动调整此代码,或者最好使用日期格式将季度天数转换为一年的实际日期(例如,df1第1天变为2017年1月1日).下面的代码只是重新排列以实现这一点,然后通过在第1:90天和第91:180天进行过滤,生成每个季度所需的结果,如图所示)


ID=c(1,1,2,2,3)
日期=c(80,85,75,80,90)
天数=c(10,10,20,10,5)
值=c(30,30,20,20,30)
df1=data.frame(ID、天、日期、值)
ID=c(1,1,2,3,3)
日期=c(1,3,5,1,10)
天数=c(20,10,20,20,10)
值=c(30,20,30,10,10)
df2=data.frame(ID、天、日期、值)
图书馆(tidyverse)
#>--附加包装-------------------------------------------------------------------tidyverse 1.2.1--
#>v ggplot2 2.2.1.9000 v purrr 0.2.4
#>v TIBLE 1.4.2 v dplyr 0.7.4
#>三分之三伏0.7.2伏纵梁1.2.0
#>v读取器1.1.1 v适用于猫0.2.0
#>--冲突---------------------------------------------------------------------tidyverse_Conflicts()--
#>x dplyr::filter()屏蔽stats::filter()
#>x dplyr::lag()屏蔽stats::lag()
df2%
变异(日期=日期+90)
#制作一个包含一整套日ID组合的数据框
df_已完成%
突变(日=系数(日期,级别=1:180))%>%#设置为总日长
完成(ID,天)%>%
突变(日和=0)%>%
选择(ID、日、日和)
#函数应用于包含事件的每个数据帧
#应采取每一个事件,并增加价值,以适当的日子
每日总金额%
变异(
四分之一=情况(
%1:90~“q1”中的天%,
天%91:180~“第二季度”
)
)
df_填充%>%
分组依据(季度,ID)%>%
总结(最大和=最大(日和))
#>#tibble:6 x 3
#>#组:季度[?]
#>四分之一ID最大和
#>        
#>第一季度1.00 60.0
#>第二季度2.00 40.0
#>第三季度3.00 30.0
#>4第2季度1.00 80.0
#>5第2季度2.00 30.0
#>6第2季度3.00 40.0

使用
数据。表
和合并将非常容易(如果可以接受,可以提供代码),如果不可以,您可以尝试找到
ID
日期
的唯一组合。由于事件时间是
日期
的总和,这使得事情变得有点棘手。如果您可以使用合并分享您的问题解决方案,那将是一件非常棒的事情!这已经有帮助了。您的输出没有日期列?您有多少数据帧和行?@Gautam我的输出不需要日期列,但可以将其包含在解决方案中!在代码中指定了90天的范围。在我的例子中,我使用了30天的范围。这就是为什么您的解决方案没有给出数字80(在本例中是3个事件的重叠,30+30+20)。此外,如果指定的日期范围在90或91(或30或31)之间,具体取决于月份(例如,某些季度比其他季度短),该怎么办?此外,您的答案很适合在每个数据帧中查找值,但不适用于从df1开始但持续到df2的事件。您还不清楚df1和df2之间的关系,我想。我看不出示例中有哪3个事件重叠。期望的答案似乎表明,您只关心df内的重叠,但即使在同一时间线上有两个df,ID1也有四个事件:第20-29天的值30,第25-34天的值30,第0-19天的值30,第3-12天的值20。没有一天是三件事情重叠的。你显然提供了一个简化的例子,但是如果你每个月都需要一些具体的事情等等。