替代R中的for循环以迭代地添加先前的行

时间:2018-02-26 16:36:41

标签: r function for-loop

我有一个大型数据集,我想要获取每行的值加上前一行。使用for循环,它非常简单,但使用我的大型数据集,需要更长的时间。我被告知应用函数的速度要快得多,但我不知道如何编写函数,我也找不到类似问题的例子。

#set up example with 10 rows
v=rep(sample(100), 10)
a=sample(100)
a=a[1:10]
mat=cbind((v/10)[1:10], a)
mat=as.data.frame(mat)
#order by first column from greatest to smallest
mat=mat[order(mat[,1], decreasing=TRUE),]
#run for lop
for (i in 2:nrow(mat)){
        mat$a.cum[i]<-sum(mat[i-1,3], mat[i,2])
        }
mat$a.cum[1]<-mat$a[1] # add value for first row

我尝试了一个矢量化解决方案,但很明显它不起作用:

mat$a.cum[2:nrow(mat)]<-mat[1:(nrow(mat)-1),3]+mat[2:nrow(mat),2]

我尝试了这个尝试,但它甚至没有像我想象的那样工作......

apply(x, FUN=function(i) x[i-1,3]+x[i,2], MARGIN=1)

这基本上是我之前遇到过的same issue但是在这种情况下提议的矢量化解决方案不起作用(就我的技能而言)所以我回过头来试图弄清楚如何写迭代示例的函数。由于输出数据框中的每一行都依赖于先前的行,并且它们迭代地向下流动,我认为矢量化在这种情况下不起作用(类似问题here但答案不是得到我正在尝试做的事情)。可能,在给定依赖于早期行的函数的情况下,它无法完成...但我希望它不是速度的情况。

2 个答案:

答案 0 :(得分:1)

有一个基函数cumsum,它为您提供向量的累积和:

mat$a.cum <- cumsum(mat$a)

示例:

cumsum(1:10)
[1]  1  3  6 10 15 21 28 36 45 55

cumsum(rep(1,10))
[1]  1  2  3  4  5  6  7  8  9 10
  

答案 1 :(得分:0)

这样的事情?

mat$a.cum=0
mat$a.cum[-1]<-cumsum(mat$a[-1])
mat$a.cum[1]<-mat$a[1]
相关问题