合并具有重叠日期范围的行的列值

3

我有一个类似于这样的数据框:

person    date1       date2     total amount  overlap
  A     2019-03-01  2019-03-16       50               
  A     2019-03-10  2019-03-31      100               
  A     2019-03-20  2019-03-31       70               
  B     2019-03-01  2019-03-12      200               
  B     2019-03-01  2019-03-20      130               
  B     2019-03-16  2019-03-31      100 

我想创建一个名为“overlap”的新列,它的值是每一行加上同一组内(这里我希望按人员列分组)与当前行日期范围重叠的其他行的值之和。
举个例子,第一行应该是50(当前行的值)加上100(因为第二行与第一行重叠),总共得到150。请注意,在此示例中,我们没有包括第三行,因为第三行的日期范围与第一行不重叠。
我尝试了group_by(person),然后使用mutate(overlap),但我不知道如何访问同一组内的其他行以了解它们是否与当前行重叠。我还尝试查找Overlap()函数,但我不确定如何利用它来得到我想要的结果。
理想情况下,我希望生成一个类似于以下表格的表:
person    date1       date2     total amount  overlap 
  A     2019-03-01  2019-03-16       50         150   
  A     2019-03-10  2019-03-31      100         220   
  A     2019-03-20  2019-03-31       70         170   
  B     2019-03-01  2019-03-12      200         330   
  B     2019-03-01  2019-03-20      130         430   
  B     2019-03-16  2019-03-31      100         230   
1个回答

3
我们可以按照 Person 进行分组,并对位于 date1date2 之间的 total_amount 进行求和。
library(dplyr)

df %>%
  mutate_at(vars(starts_with("date")),  as.Date) %>%
  group_by(person) %>%
  mutate(overlap = purrr::map2_dbl(date1, date2, 
             ~sum(total_amount[between(date1, .x, .y) | between(date2, .x, .y)])))

#  person date1      date2      total_amount overlap
#  <fct>  <date>     <date>            <int>   <dbl>
#1 A      2019-03-01 2019-03-16           50     150
#2 A      2019-03-10 2019-03-31          100     220
#3 A      2019-03-20 2019-03-31           70     170
#4 B      2019-03-01 2019-03-12          200     330
#5 B      2019-03-01 2019-03-20          130     430
#6 B      2019-03-16 2019-03-31          100     230

数据

df <- structure(list(person = structure(c(1L, 1L, 1L, 2L, 2L, 2L), .Label = c("A", 
"B"), class = "factor"), date1 = structure(c(1L, 2L, 4L, 1L, 
1L, 3L), .Label = c("2019-03-01", "2019-03-10", "2019-03-16", 
"2019-03-20"), class = "factor"), date2 = structure(c(2L, 4L, 
4L, 1L, 3L, 4L), .Label = c("2019-03-12", "2019-03-16", "2019-03-20", 
"2019-03-31"), class = "factor"), total_amount = c(50L, 100L, 
70L, 200L, 130L, 100L)), class = "data.frame", row.names = c(NA, -6L))

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接