4

我有一个 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

谢谢

4

2 回答 2

4

只需使用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一的向量,因此您需要用length0,因此您需要用 a 填充输入(因此也保留该列中的原始值)。


正如@DavidArenburg 提到的,您也可以轻松地将其调整为“data.table”代码,如下所示:

library(data.table)
as.data.table(mydf)[, lapply(.SD, function(x) diff(c(0, x)))]
于 2014-11-25T10:08:41.367 回答
1

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

或从dplyr1.0.0

df %>%
   mutate(across(X1:X2, ~ .-c(0,lag(.)[-1])))
于 2014-11-25T11:16:36.490 回答