2016-07-12 49 views
-2

我希望能夠將每行中的值與下面的值相加並將結果分配給R中的新列。如何使用R中的apply函數創建列與前一列的當前行和行之和的列?

下面的代碼(幾乎)實現了我想要的for循環(除了我必須手動做最後一行 - 這不是一個真正的問題)。我想做類似的事情,但使用apply函數,因爲for循環在我的大數據集上非常慢 - 但我無法弄清楚apply語法。

data<-data.frame(runif(10)) 

data$x<- 
for (i in 1:nrow(data)) { 
    data[i,2 ] <- data[i,1]+data[i+1,1] 
          } 
+0

最後一行和什麼和?零? – Tav

+1

提問前做一些研究。問題已經存在[這裏](http://stackoverflow.com/questions/19200841/consecutive-rolling-sums-in-a-vector-in-r?noredirect=1&lq=1)。當人們在驗證一個之前需要時間回答您的問題時,請閱讀所有答案。 –

回答

0

我們可以通過從列的任一端移除一個值並使用NA進行簡化來獲得當前值與前一個值的總和。

data$x <- c(data[,1][-1] + data[,1][-nrow(data)], NA) 
1

使用rollSum(包RcppRoll

您可以使用該功能roll_sum(x, nb),讓你做一個向量的(連續)滾動總和。

,如果我們把你的例子:

data<-data.frame(x=runif(10000000)) 
data$sum<-roll_sum(data$x, 1) 

也有rollapply(x, nb, fct)從包裝zoo但較少高性能。

你可以看到一個微型基準here

轉換數據

也許只是你改造由他創建副本少的第一個值向量和0的最後一個值將正常工作。

data<-data.frame(x=runif(10)) 
data$copy<-c(data$x[-1],0) 
data$sum<-rowSums(data) 
0

您可以製作一個由1開始的向量(它從第二個組件開始),並在其末尾添加一個NA。然後做總和。

data<-data.frame(runif(10)) 
col1 <- data$runif.10. 
col1.off <- col1[2:length(col1)] 
col1.off <- c(col1.off, NA) 
data$x <- col1 + col1.off 
相關問題