2016-07-12 51 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 
相关问题