【发布时间】:2019-07-20 08:54:09
【问题描述】:
我有一个数据框,其中包含按组的累积值,我需要重新计算回原始值。 lag 函数在这里工作得很好,但不是序列中的第一个数字,而是返回 NA,或者两组之间的滞后。
如何代替NA值或组间差异获得组中的第一个数字?
我的虚拟数据:
# make example
df <- data.frame(id = rep(1:3, each = 5),
hour = rep(1:5, 3),
value = sample(1:15))
首先计算累积值,然后将其转换回行值。即value 应该等于valBack。 mutate(valBack = c(cumsum[1], (cumsum - lag(cumsum))[-1])) 的建议只是将第一个 (NA) 值替换为正确的值,但不适用于每个组的第一个数字?
df %>%
group_by(id) %>%
dplyr::mutate(cumsum = cumsum(value)) %>%
mutate(valBack = c(cumsum[1], (cumsum - lag(cumsum))[-1])) # skip the first value in a lag vector
哪些结果:
# A tibble: 15 x 5
# Groups: id [3]
id hour value cumsum valBack
<int> <int> <int> <int> <int>
1 1 1 10 10 10 # this works
2 1 2 13 23 13
3 1 3 8 31 8
4 1 4 4 35 4
5 1 5 9 44 9
6 2 1 12 12 -32 # here the new group start. The number should be 12, instead it is -32??
7 2 2 14 26 14
8 2 3 5 31 5
9 2 4 15 46 15
10 2 5 1 47 1
11 3 1 2 2 -45 # here should be 2 istead of -45
12 3 2 3 5 3
13 3 3 6 11 6
14 3 4 11 22 11
15 3 5 7 29 7
我想通过安全计算使我的valBack 等于value。 (当然,在真实数据中我没有value 列,只有cumsum 列)
【问题讨论】: