【问题标题】:Lag without previous value in RR 中没有先前值的滞后
【发布时间】:2022-11-21 17:44:02
【问题描述】:

我有一个 6 列的 df。我想根据日期找到增量,并按前几列分组。

df <- data.frame (col1  = c('A1','A1','A1','A2','A2','A2','A1','A1','A1','A2','A2','A2','A2','A2','A2'),
                  col2 = c('B1','B2','B3','B1','B2','B3','B1','B2','B3','B1','B2','B3','B1','B2','B3'),
                  col3 = c('C1','C2','C3','C1','C2','C3','C1','C2','C3','C1','C2','C3','C1','C2','C3'),
                  col4 = c('D1','D2','D22','D4','D5','D6','D1','D2','D3','D4','D5','D6','D7','D8','D9'),
                  col5 = c('1/01/2021','1/01/2021','1/01/2021','1/01/2021','1/01/2021','1/01/2021',
                           '1/01/2022','1/01/2022','1/01/2022','1/01/2022','1/01/2022','1/01/2022',
                           '1/01/2022','1/01/2022','1/01/2022'),
                  col6 = c(10,20,30,40,50,60,100, 200, 300,400,500,600,60,60, 60)
                  
)
diff_na<-df%>%
  group_by(col1,col2,col3,col4) %>%
  mutate(diff = col6 - lag(col6, default = first(col6,default = 0), order_by = col5))

预期输出是:

df11 <- data.frame (col1  = c('A1','A1','A1','A2','A2','A2','A1','A1','A1','A2','A2','A2','A2','A2','A2'),
                  col2 = c('B1','B2','B3','B1','B2','B3','B1','B2','B3','B1','B2','B3','B1','B2','B3'),
                  col3 = c('C1','C2','C3','C1','C2','C3','C1','C2','C3','C1','C2','C3','C1','C2','C3'),
                  col4 = c('D1','D2','D22','D4','D5','D6','D1','D2','D3','D4','D5','D6','D7','D8','D9'),
                  col5 = c('1/01/2021','1/01/2021','1/01/2021','1/01/2021','1/01/2021','1/01/2021',
                           '1/01/2022','1/01/2022','1/01/2022','1/01/2022','1/01/2022','1/01/2022',
                           '1/01/2022','1/01/2022','1/01/2022'),
                  col6 = c(10,20,30,40,50,60,100, 200, 300,400,500,600,60,60, 60),
                  dfiff =c(0,0,30,0,0,0,90,180,300,360,450,540,60,60,60)
                  
)

如果前面的 col4 中的值不存在,我将面临一个问题,那么它不会减去该值。我的意思是它应该将缺失值视为 0。我尝试将第一个默认值设置为 0。但不知何故,最后三个差异值是 0 而不是 60。 请指导我哪里出错了。

第 3 行在 Col4 中的值为 D22,它在日期 01/01/2022 中不存在,因此应该存在 30。类似的第 13、14、15 行没有日期 01/01/2021 的对应值。所以 diff col 应该有 60 。

感谢和问候, R

【问题讨论】:

  • 您的预期输出是什么?
  • 最后一个值应该是 60,我的意思是如果没有匹配,那么最新日期的相同值应该是值。

标签: r


【解决方案1】:

你让它变得比它需要的更复杂。您的新列只是第 6 列的 first 值,后跟每个组的第 6 列的 diff

df %>%
  group_by(col1, col2, col3, col4) %>%
  mutate(diff = c(first(col6), diff(col6)))
#> # A tibble: 15 x 7
#> # Groups:   col1, col2, col3, col4 [9]
#>    col1  col2  col3  col4  col5       col6  diff
#>    <chr> <chr> <chr> <chr> <chr>     <dbl> <dbl>
#>  1 A1    B1    C1    D1    1/01/2021    10    10
#>  2 A1    B2    C2    D2    1/01/2021    20    20
#>  3 A1    B3    C3    D3    1/01/2021    30    30
#>  4 A2    B1    C1    D4    1/01/2021    40    40
#>  5 A2    B2    C2    D5    1/01/2021    50    50
#>  6 A2    B3    C3    D6    1/01/2021    60    60
#>  7 A1    B1    C1    D1    1/01/2022   100    90
#>  8 A1    B2    C2    D2    1/01/2022   200   180
#>  9 A1    B3    C3    D3    1/01/2022   300   270
#> 10 A2    B1    C1    D4    1/01/2022   400   360
#> 11 A2    B2    C2    D5    1/01/2022   500   450
#> 12 A2    B3    C3    D6    1/01/2022   600   540
#> 13 A2    B1    C1    D7    1/01/2022    60    60
#> 14 A2    B2    C2    D8    1/01/2022    60    60
#> 15 A2    B3    C3    D9    1/01/2022    60    60

【讨论】:

  • 谢谢 Allan,但是 diff 中的前六个值应该为零。
  • @RBan 但是如果前几个值应该是零,为什么最后几个值应该是 60?例如,最后一行是其组中的唯一成员,所以如果组中的第一个成员的差异应该为 0,为什么那个应该是 60?你确定你应该按 col4 分组吗?
猜你喜欢
  • 1970-01-01
  • 2018-11-27
  • 1970-01-01
  • 1970-01-01
  • 2021-06-04
  • 2018-12-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多