我有一个 df ,其中每一行是它上面的行的累积总和。有没有办法从这个df中得出原始值?
X1 X2
1 1 5
2 3 9
3 6 12
4 10 14
5 15 15
期望的输出:
X1 X2
1 1 5
2 2 4
3 3 3
4 4 2
5 5 1
谢谢
只需使用diff
. 假设您的数据集称为“mydf”并且您想对所有列执行此操作,请尝试:
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
,因此您需要用 a 填充输入(因此也保留该列中的原始值)。
正如@DavidArenburg 提到的,您也可以轻松地将其调整为“data.table”代码,如下所示:
library(data.table)
as.data.table(mydf)[, lapply(.SD, function(x) diff(c(0, x)))]
使用dplyr
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
df %>%
mutate_at(vars(X1:X2), ~ .-c(0,lag(.)[-1]))
或从dplyr
1.0.0
df %>%
mutate(across(X1:X2, ~ .-c(0,lag(.)[-1])))