p<-c(1, 2, 3, 4, 5, 6, 7, 8, 9, 10)
q<-c("a", "a", "a", "b", "b", "c", "c", "c", "c", "c")
r<-c(0, 1, 3, 0, 4, 0, 6, 13, 21, 30)
t<-data.frame(p,q,r)
在上面的数据中,我试图获得向量r。向量r是向量p的累积和,具有滞后和在向量q上设置的标准。请假定dataframe已经使用向量q按字母顺序排序
我试过创建多个滞后向量,然后尝试求和。但这并不理想。
6条答案
按热度按时间xpcnnkqh1#
最有效的方法是使用
collapse
。首先创建一个
GRP
对象。然后使用
GRP
对象进行分组滞后和累积求和。collapse
对比data.table
基准测试3组
10^7行,约10^6组
juud5qan2#
**1)**这是使用
ave
和cumsum
的基础R解决方案。**2)**此变体也适用:
**3)**同样的思路也可以用在折叠包上
4sup72z83#
这将是相当快的:
这样会更快:
ccgok5k54#
如果我们需要良好的性能,同时保持在dplyr内,我们可以使用
dtplyr
。dtplyr是dplyr的一个数据表前端。它使用data.table运行大部分代码。并非所有的dplyr动词和操作都可以翻译,但是对于像这样的简单用例,它工作得很好。lkaoscv75#
data.table
可以尝试anauzrmj6#
正如问题中所述,可以假设向量 * 已经排序 *,您可以在
q
发生变化的地方取索引,并在这些位置减去cumsum
。问题可能是,由于
cumsum
是在整个向量上构建的,因此其结果可能不像分组时那样准确。另一个变体是对向量进行子集化。基准
结果
在这种情况下,使用 collapse 和 * data.table * 比 base Map和rev快2倍,比
ave
快5倍。