2014-11-25 38 views
2

我有一個df,其中每行是其上面一行的累計總和。有沒有辦法從這個df派生出原始值?扭轉累計總和以確定R中的實際值

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

只需使用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輸入(因此也保留了該欄中的原始值)。


由於@DavidArenburg提到,你也可以很容易地適應這個以 「data.table」 代碼太,像這樣:

library(data.table) 
as.data.table(mydf)[, lapply(.SD, function(x) diff(c(0, x)))] 
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