2011-10-19 75 views
5

的累加和假設有這樣一個數據幀:計算某些值

df <- data.frame(Nums = c(1,2,3,4,5,6,7,8,9,10), Cum.sums = NA) 
> df 
    Nums Cum.sums 
1  1  NA 
2  2  NA 
3  3  NA 
4  4  NA 
5  5  NA 
6  6  NA 
7  7  NA 
8  8  NA 
9  9  NA 
10 10  NA 

並且希望這樣的輸出:

Nums Cum.sums 
1  1  0 
2  2  0 
3  3  0 
4  4  3 
5  5  5 
6  6  7 
7  7  9 
8  8  11 
9  9  13 
10 10  15 

列的4元件Cum.sum是1和2的總和,列Cum.sum的5.元素是2和3的和,等等...... 這意味着,我想構建第一行的累積和並保存它在第二行。但是,我不想要正常的累計和,而是當前行上方的元素2行加上當前行上方的元素3行之和。

我已經嘗試過和sum和cumsum函數玩一下,但是我失敗了。

任何想法?

謝謝!

回答

3

您可以使用embed函數創建合適的滯後,rowSums進行求和,然後適當延遲(我使用了head)。

df$Cum.sums[-(1:3)] <- head(rowSums(embed(df$Nums,2)),-2) 
+0

謝謝約書亞!很棒! –

0

你不需要任何特殊的功能,只需使用普通的向量運算(這些解決方案都是等效的):

df$Cum.sums[-(1:3)] <- head(df$Nums, -3) + head(df$Nums[-1], -2) 

with(df, Cum.sums[-(1:3)] <- head(Nums, -3) + head(Nums[-1], -2)) 

df$Cum.sums[-(1:3)] <- df$Nums[1:(nrow(df)-3)] + df$Nums[2:(nrow(df)-2)] 

我相信前3個數字應該b ËNA,而不是0,但如果你喜歡零,可以先初始化和:

df$Cum.sums <- 0 
+0

雖然這是針對此特定問題的有效解決方案,但它沒有很好地概括(例如,如果累計總和超過20行而不是2)。 –

+0

@Joshua,你是對的,我發佈了更多的通用解決方案,但不是很實用。你的解決方案可能是最好的。 – TMS

0

另一種解決方案,優雅,一般情況下,使用矩陣乘法 - 等大數據非常低效的。所以它不是很實用,雖然很好的練習:

len <- nrow(df) 
sr <- 2 # number of rows to sum 
lag <- 3 
mat <- matrix(
      head(c(
       rep(0, lag * len), 
       rep(rep(1:0, c(sr, len - sr + 1)), len) 
       ), len * len), 
      nrow = 10, byrow = TRUE 
     ) 
mat %*% df$Nums