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 |
谢谢
只需使用 diff。假设您的数据集称为”mydf”并且您想对所有列执行此操作,请尝试:
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 |
由于 diff 返回的向量 length 比输入小一,因此您需要用 0 填充输入(因此也保留了该列中的原始值)。
正如@DavidArenburg 所提到的,您也可以轻松地将其改编为”data.table”代码,如下所示:
1
2 |
library(data.table)
as.data.table(mydf)[, lapply(.SD, function(x) diff(c(0, x)))] |
使用 dplyr
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 在评论中提到的,在 dplyr
的最新版本中
1
2 |
df %>%
mutate_at(vars(X1:X2), ~ .-c(0,lag(.)[-1])) |
或来自 dplyr 1.0.0
1
2 |
df %>%
mutate(across(X1:X2, ~ .-c(0,lag(.)[-1]))) |
- 最近发现了这个(并使用了修改后的版本),所以感谢您的发布!很久以后才来到这里,不推荐使用 mutate_each 并且代码现在需要: df %>% mutate_at(vars(X1:X2),funs(.-c(0,lag(.)[-1]))) 希望这对将来的某人有所帮助,并感谢您的帖子。
- @BrennanBeal 谢谢。我在帖子中添加了您的评论。希望你不介意。谢谢
来源:https://www.codenong.com/27123763/