我有一个大型数据集,我想要获取每行的值加上前一行。使用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但答案不是得到我正在尝试做的事情)。可能,在给定依赖于早期行的函数的情况下,它无法完成...但我希望它不是速度的情况。
答案 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]