Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/user-interface/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R:如果日期差小于7,则按组从上一行添加值_R - Fatal编程技术网

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