我试图在一个非常大的数据框(约220万行)中创建一个列,计算每个因子级别的1的累积和,并在达到新的因子级别时重置.以下是一些类似于我自己的基本数据.
itemcode <- c('a1', 'a1', 'a1', 'a1', 'a1', 'a2', 'a2', 'a3', 'a4', 'a4', 'a5', 'a6', 'a6', 'a6', 'a6')
goodp <- c(0, 1, 1, 0, 1, 1, 1, 0, 0, 1, 1, 1, 1, 0, 1)
df <- data.frame(itemcode, goodp)
Run Code Online (Sandbox Code Playgroud)
我想输出变量cum.goodp看起来像这样:
cum.goodp <- c(0, 1, 2, 0, 1, 1, 2, 0, 0, 1, 1, 1, 2, 0, 1)
Run Code Online (Sandbox Code Playgroud)
我知道那里有很多使用规范的split-apply-combine方法,从概念上讲它是直观的,但我尝试使用以下方法:
k <- transform(df, cum.goodp = goodp*ave(goodp, c(0L, cumsum(diff(goodp != 0)), FUN = seq_along, by = itemcode)))
Run Code Online (Sandbox Code Playgroud)
当我尝试运行此代码时,它非常慢.我得到的变化是其中一部分原因('by'也没有帮助).itemcode变量有超过70K的不同值,因此它应该是矢量化的.有没有办法使用cumsum对其进行矢量化?如果没有,任何帮助都将得到真正的赞赏.非常感谢.