2017-10-10 44 views
0

假設我有以下數據幀如何使用dplyr創建其中使用它自己的滯後值的列

c1<- c(1:10) 
c2<- c(11:20) 
df<- data.frame(c1,c2) 

c1 c2 
1 11 
2 12 
3 13 
4 14 
5 15 
6 16 
7 17 
8 18 
9 19 
10 20 

我想添加一個柱C3是C3(-1)的總和+ C2 -C1。例如, 在預期的結果上面的例子將是:

c1 c2 c3 
1 11 0 
2 12 10 
3 13 20 
4 14 30 
5 15 40 
6 16 50 
7 17 60 
8 18 70 
9 19 80 
10 20 90 

是否有可能使用dplyr執行此操作?我嘗試了幾種方法,但都沒有成功。任何建議將不勝感激。

回答

3

這是一個很好用的cumsum - 累計求和。

c3 = lag(cumsum(c2 - c1), default = 0) 

不要以爲c3爲C3(-1)+ C2 - C1,認爲它是C3(N)=總和(從1到n - 1)C2(1) - C1(ⅰ )

+0

隨着'dplyr':'DF%>%突變(C3 =滯後(cumsum(C2 - C1),默認= 0))' – useR

+0

我沒有想到要使用cumsum()。感謝所有的答案。 – Chene

3

這創建了列c3。假設第一個條目總是0,因爲沒有前面的元素。

df$c3 <- df$c2 - df$c1 
df[1,"c3"] <- 0 
df$c3 <- cumsum(df$c3) 

輸出

> df 
    c1 c2 c3 
1 1 11 0 
2 2 12 10 
3 3 13 20 
4 4 14 30 
5 5 15 40 
6 6 16 50 
7 7 17 60 
8 8 18 70 
9 9 19 80 
10 10 20 90 
> 
+0

這在這種情況下是有效的,因爲'c2'和'c1'之間的區別是不變的 - 但是OP的短語說明了你需要刪除最後一個元素的問題,並且將0追加到前面以使其一般工作,而不僅僅是用0替換第一個元素。 – Gregor

相關問題