反转累计和以确定R中的实际值

时间:2014-11-25 10:06:31

标签: r cumsum

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

由于

2 个答案:

答案 0 :(得分: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返回的lenght向量比输入少一个,因此您需要使用0填充输入(因此也会保留该列中的原始值)。< / p>


正如@DavidArenburg所提到的,你也可以轻松地将其改编为&#34; data.table&#34;代码也是这样的:

library(data.table)
as.data.table(mydf)[, lapply(.SD, function(x) diff(c(0, x)))]

答案 1 :(得分:0)

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