我偶然发现了一个直截了当的问题:
我有这样的数据框
Child child = mom.children.find { it.name == 'child' }
y列是延迟,x列是等待时间。鉴于等待将减少等待时间,我希望有类似
的东西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
使用循环是最简单的方法,但我使用dplyr寻找解决方案。我尝试了lag()和ifelse,但继续获得NA。
答案 0 :(得分:7)
您可以从cumsum
的初始值中减去列x
的{{1}}(累计总和),因此在dplyr中,
y
或纯碱,
最喜欢的变体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
更广泛地说,您可以将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
与Reduce
一起使用来构建更复杂的累积函数:
accumulate = TRUE
或其整齐的版本Reduce(`-`, d$x, init = d$y[1], accumulate = TRUE)
#> [1] 3 3 3 3 2 2 0 0
:
purrr::accumulate