我偶然发现了一个看起来像是一个直截了当的问题的东西:
我有这样一个数据框架
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.
你可以从初始值中减去列的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)
| 归档时间: |
|
| 查看次数: |
396 次 |
| 最近记录: |