R dplyr分组DataFrame使用窗口函数计算rn=7与rn=6行cumprice差值方法
解决方案
基础实现(逻辑直观,无需额外依赖)
你已经完成了分组、生成rn、计算累计价格的前置操作,无需调用cur_data()这类复杂函数,直接利用dplyr分组操作的特性即可完成字段新增:
grp_diamonds <- grp_diamonds %>% mutate(GROWTH_6_7 = cumprice[rn == 7] - cumprice[rn == 6])
代码说明
- dplyr分组后的mutate操作,所有向量索引都限定在当前分组内,
cumprice[rn == 7]会自动取当前(cut, color)分组内rn为7行的cumprice值 - 计算得到的差值会自动广播到当前分组的所有行,若分组行数不足7行,该字段值自动为NA
- 如果仅需要在rn=7的行展示差值,其余行留空,可调整为:
grp_diamonds <- grp_diamonds %>% mutate(GROWTH_6_7 = ifelse(rn == 7, cumprice[rn == 7] - cumprice[rn == 6], NA))
你之前用cur_data实现失败,是因为这个场景不需要调用cur_data,cur_data多用于需要将整个分组数据传入自定义函数的场景,当前简单的索引操作直接引用列名即可。
更优实现(利用累计和特性,效率更高)
因为你的cumprice是按rn顺序计算的价格累计和,根据累计和的数学性质,cumprice[n] - cumprice[n-1] 等价于第n行的price值,因此你需要的GROWTH_6_7本质就是当前分组内rn=7行的price字段值,可简化为:
grp_diamonds <- grp_diamonds %>% mutate(GROWTH_6_7 = price[rn == 7])
方案优势
- 减少了一次cumprice字段的查找和一次减法运算,处理大样本时效率更高
- 逻辑更简洁,避免了多字段引用可能出现的索引错误
内容的提问来源于stack exchange,提问作者Doug Fir
相关产品推荐
相关产品推荐

