关于cumsum:反转累积和以确定R中的实际值

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])))