R:如果日期差小于7,则按组从上一行添加值
我有一个问题以某种方式将这两个问题结合起来(和)。但无法使脚本正常工作 我有一个类似以下内容的数据集:R:如果日期差小于7,则按组从上一行添加值,r,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 我想
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天。我们可以按id
和求和min
值对每个日期进行分组,为期7天
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
库(dplyr)
df%>%
分组依据(id)%>%
突变(totmin=purrr::map_dbl(date,~sum(min[between(date,-7,))))
#id日期最小值totmin
#
#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")
df这可以使用fuzzyjoin
完成:
库(dplyr)
df%
变异(日期=as.date(日期))
我们将通过id
和date
将df
与自身连接起来,从第二个df
中选择行,其中id
相同,第二个date
介于第一个日期和第一个日期-7之间
library(fuzzyjoin)
df_join <-
fuzzy_left_join(
df, df,
by = c("id", "date"),
match_fun = c(
"id" = `==`,
"date" = function(x, y) {y <= x & y >= x - 7}
)
)
df_join
#> # A tibble: 13 x 6
#> id.x date.x min.x id.y date.y min.y
#> <dbl> <date> <dbl> <dbl> <date> <dbl>
#> 1 1 2015-07-18 25 1 2015-07-18 25
#> 2 1 2015-07-22 15 1 2015-07-18 25
#> 3 1 2015-07-22 15 1 2015-07-22 15
#> 4 1 2015-07-23 10 1 2015-07-18 25
#> 5 1 2015-07-23 10 1 2015-07-22 15
#> 6 1 2015-07-23 10 1 2015-07-23 10
#> 7 1 2015-07-30 15 1 2015-07-23 10
#> 8 1 2015-07-30 15 1 2015-07-30 15
#> 9 2 2015-07-10 10 2 2015-07-10 10
#> 10 2 2015-07-16 20 2 2015-07-10 10
#> 11 2 2015-07-16 20 2 2015-07-16 20
#> 12 2 2015-07-23 10 2 2015-07-16 20
#> 13 2 2015-07-23 10 2 2015-07-23 10
库(fuzzyjoin)
df#u join#A tible:13 x 6
#>id.x日期.x最小值.x id.y日期.y最小值
#>
#> 1 1 2015-07-18 25 1 2015-07-18 25
#> 2 1 2015-07-22 15 1 2015-07-18 25
#> 3 1 2015-07-22 15 1 2015-07-22 15
#> 4 1 2015-07-23 10 1 2015-07-18 25
#> 5 1 2015-07-23 10 1 2015-07-22 15
#> 6 1 2015-07-23 10 1 2015-07-23 10
#> 7 1 2015-07-30 15 1 2015-07-23 10
#> 8 1 2015-07-30 15 1 2015-07-30 15
#> 9 2 2015-07-10 10 2 2015-07-10 10
#> 10 2 2015-07-16 20 2 2015-07-10 10
#> 11 2 2015-07-16 20 2 2015-07-16 20
#> 12 2 2015-07-23 10 2 2015-07-16 20
#> 13 2 2015-07-23 10 2 2015-07-23 10
现在我们必须按id和第一个日期分组,并计算总分钟数
res%
选择(id=id.x,date=date.x,min.x,min.y)%>%
分组人(id,日期)%>%
总结(最小值=第一个(最小值x),总计=总和(最小值y))
物件
#>#tibble:7 x 4
#>#组:id[2]
#>id日期最小值totmin
#>
#> 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