【问题标题】:Alternative to for loop in R for adding previous rows iteratively替代 R 中的 for 循环以迭代地添加先前的行
【发布时间】:2018-02-26 16:36:40
【问题描述】:

我有一个大型数据集,我想获取每行加上前一行的值。使用 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,但答案没有得到我正在尝试做的事情)。考虑到对前面行的依赖关系,可能无法通过函数来​​完成……但为了速度,我希望不是这种情况。

【问题讨论】:

  • 你不想要一个cumsum 吗?

标签: r function for-loop


【解决方案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

【讨论】:

    【解决方案2】:

    这样的?

    mat$a.cum=0
    mat$a.cum[-1]<-cumsum(mat$a[-1])
    mat$a.cum[1]<-mat$a[1]
    

    【讨论】:

      猜你喜欢
      • 2019-06-01
      • 1970-01-01
      • 2020-07-26
      • 2021-07-07
      • 2020-03-03
      • 2021-12-20
      • 1970-01-01
      • 1970-01-01
      • 2021-04-12
      相关资源
      最近更新 更多