【问题标题】:R rolling subtraction vectorized alternative to a for loopR滚动减法矢量化替代for循环
【发布时间】:2021-03-23 11:02:19
【问题描述】:
Leaves<- c(2,4,6,7,8,10,11,15)
ax<- c(2,1,1,2,3,1,1,1)
bx <- c(0,0,0,0,2,0,0,1) 
mydata<- data.frame(Leaves, ax, bx)
Sx<- c()
Sx[1] <- sum(x$ax)
for(i in 2:length(mydata$Leaves)){     
  Sx[i] <- Sx[i-1] - mydata$ax[i-1]
}

这里发生的事情是我希望 Sx 列的第一个值是 ax 列的总和。 Sx 的第二个值应该是 Sx[1]-ax[1],Sx 的第三个值应该是 Sx[2]-ax[2,依此类推。

此代码现在可以工作,但它是一个 for 循环。有谁知道一种方法可以对此 for 循环进行矢量化替代?我已经研究了很多 Dplyr lag 和 data.table shift 函数,但我不确定如何让它们工作。

【问题讨论】:

    标签: r for-loop vectorization


    【解决方案1】:

    矢量化方式是:

    mydata$Sx <- sum(mydata$ax) - cumsum(mydata$ax) + mydata$ax
    mydata
    
    #  Leaves ax bx Sx
    #1      2  2  0 12
    #2      4  1  0 10
    #3      6  1  0  9
    #4      7  2  0  8
    #5      8  3  2  6
    #6     10  1  0  3
    #7     11  1  0  2
    #8     15  1  1  1
    

    【讨论】:

    • 你让它看起来很简单,非常感谢!
    猜你喜欢
    • 2020-05-03
    • 1970-01-01
    • 1970-01-01
    • 2019-02-28
    • 1970-01-01
    • 2014-10-03
    • 2012-12-10
    • 1970-01-01
    相关资源
    最近更新 更多