首页 > 解决方案 > R:如果日期差小于 7,则按组从前一行添加值

问题描述

我有一个问题以某种方式结合了这两个问题(从前一行中减去日期(使用 R)从前一行中减去值)。但无法设法让脚本工作。

我有一个看起来像这样的数据集:

id  |     date    |  min  
 1  |  2015-07-18 |  25
 1  |  2015-07-22 |  15
 1  |  2015-07-23 |  10
 1  |  2015-07-30 |  15
 2  |  2015-07-10 |  10
 2  |  2015-07-16 |  20
 2  |  2015-07-23 |  10

我想创建一个新列 totmin ,它通过 id 添加过去 7 天播放的总分钟数:

id  |     date    |  min  |  totmin
 1  |  2015-07-18 |  25   |    25
 1  |  2015-07-22 |  15   |    40
 1  |  2015-07-23 |  10   |    50
 1  |  2015-07-30 |  15   |    25
 2  |  2015-07-10 |  10   |    10
 2  |  2015-07-16 |  20   |    30
 2  |  2015-07-23 |  10   |    30

我尝试过lag但不知道如何限制为只有 7 天。

标签: r

解决方案


我们可以在 7 天的时间内group_by idsum min每个人提供价值。date

library(dplyr)

df %>%
  group_by(id) %>%
  mutate(totmin = purrr::map_dbl(date, ~sum(min[between(date, . - 7, .)])))

#     id  date         min totmin
#   <int> <date>     <int>  <dbl>
#1     1 2015-07-18    25     25
#2     1 2015-07-22    15     40
#3     1 2015-07-23    10     50
#4     1 2015-07-30    15     25
#5     2 2015-07-10    10     10
#6     2 2015-07-16    20     30
#7     2 2015-07-23    10     30

数据

df <- structure(list(id = c(1L, 1L, 1L, 1L, 2L, 2L, 2L), date = structure(c(16634, 
16638, 16639, 16646, 16626, 16632, 16639), class = "Date"), min = c(25L, 
15L, 10L, 15L, 10L, 20L, 10L)), row.names = c(NA, -7L), class = "data.frame")

推荐阅读