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

时间:2017-10-12 01:54:05

标签: r dplyr

我偶然发现了一个直截了当的问题:

我有这样的数据框

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。

1 个答案:

答案 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