使用dplyr更新数据框行中的值

Xav*_*ent 0 r dplyr

我偶然发现了一个看起来像是一个直截了当的问题的东西:

我有这样一个数据框架

d <- data.frame(x=c(0,0,0,1,0,2,0),y=c(3,NA,NA,NA,NA,NA,NA))

  x  y
1 0  3
2 0 NA
3 0 NA
4 1 NA
5 0 NA
6 2 NA
7 0 NA
Run Code Online (Sandbox Code Playgroud)

y列是延迟,x列是等待时间.鉴于等待将减少等待时间,我希望有类似的东西

  x  y
1 0  3
2 0  3
3 0  3
4 1  2
5 0  2
6 2  0
7 0  0
Run Code Online (Sandbox Code Playgroud)

使用循环是最简单的方法,但我使用dplyr寻找解决方案.我尝试了lag()和ifelse,但继续获得NA.

ali*_*ire 7

你可以从初始值中减去列的cumsum(累积和),所以在dplyr中,xy

d <- data.frame(x = c(0,0,0,1,0,2,0),
                y = c(3,NA,NA,NA,NA,NA,NA))

library(dplyr)

d %>% mutate(y = first(y) - cumsum(x))
#>   x y
#> 1 0 3
#> 2 0 3
#> 3 0 3
#> 4 1 2
#> 5 0 2
#> 6 2 0
#> 7 0 0
Run Code Online (Sandbox Code Playgroud)

或者在纯碱中,你最喜欢的变种

d$y <- d$y[1] - cumsum(d$x)

d
#>   x y
#> 1 0 3
#> 2 0 3
#> 3 0 3
#> 4 1 2
#> 5 0 2
#> 6 2 0
#> 7 0 0
Run Code Online (Sandbox Code Playgroud)

更广泛地说,您可以使用Reducewith accumulate = TRUE来构建更复杂的累积函数:

Reduce(`-`, d$x, init = d$y[1], accumulate = TRUE)
#> [1] 3 3 3 3 2 2 0 0
Run Code Online (Sandbox Code Playgroud)

或其整齐的版本purrr::accumulate:

purrr::accumulate(d$x, `-`, .init = d$y[1])
#> [1] 3 3 3 3 2 2 0 0
Run Code Online (Sandbox Code Playgroud)