Reversing cumulative sum to determine actuals in R
我有一个 df ,其中每一行是它上面的行的累积和。有没有办法从这个 df 导出原始值?
1 2 3 4 5 6 | X1 X2 1 1 5 2 3 9 3 6 12 4 10 14 5 15 15 |
期望的输出:
1 2 3 4 5 6 | X1 X2 1 1 5 2 2 4 3 3 3 4 4 2 5 5 1 |
谢谢
只需使用
1 2 3 4 5 6 7 8 | mydf[] <- lapply(mydf, function(x) diff(c(0, x))) mydf # X1 X2 # 1 1 5 # 2 2 4 # 3 3 3 # 4 4 2 # 5 5 1 |
由于
正如@DavidArenburg 所提到的,您也可以轻松地将其改编为"data.table"代码,如下所示:
1 2 | library(data.table) as.data.table(mydf)[, lapply(.SD, function(x) diff(c(0, x)))] |
使用
1 2 3 4 5 6 7 8 9 | library(dplyr) df %>% mutate_each(funs(.-c(0,lag(.)[-1]))) # X1 X2 #1 1 5 #2 2 4 #3 3 3 #4 4 2 #5 5 1 |
或者正如@BrennanBeal 在评论中提到的,在
的最新版本中
1 2 | df %>% mutate_at(vars(X1:X2), ~ .-c(0,lag(.)[-1])) |
或来自
1 2 | df %>% mutate(across(X1:X2, ~ .-c(0,lag(.)[-1]))) |