在R中使用dplyr复现SQL OVER(PARTITION BY)累计求和列的问题
报错原因
with_order参数使用错误:fun参数需传入函数对象(如cumsum),不可传入已执行的函数调用表达式(如cumsum(new_vaccinations)),需传入函数的计算值要放在x参数中,参数传混是你报错的直接原因。- 实现方向偏差:
with_order仅对应SQL窗口函数中的ORDER BY排序逻辑,你需要的PARTITION BY分组逻辑在dplyr中对应group_by()函数,二者功能完全不同。
正确实现方案
你的核心需求是按location分组计算累计接种量,对应SQL的SUM(new_vaccinations) OVER (PARTITION BY location ORDER BY date),使用dplyr实现的标准写法如下:
test <- mydf %>% # 对应 PARTITION BY location 分组逻辑 group_by(location) %>% # 分组内按日期排序,对应窗口函数的 ORDER BY date arrange(date, .by_group = TRUE) %>% # 计算分组内累计和 mutate(total_vax = cumsum(new_vaccinations)) %>% # 计算完成后取消分组,避免影响后续操作 ungroup()
如果需要保留原数据的行顺序不做排序,可配合with_order实现:
test <- mydf %>% group_by(location) %>% mutate(total_vax = with_order( order_by = date, fun = cumsum, x = new_vaccinations )) %>% ungroup()
如果你需要的是同分组所有行一致的总接种量(对应SQL无ORDER BY的OVER(PARTITION BY)逻辑),写法更简单:
test <- mydf %>% group_by(location) %>% mutate(total_vax = sum(new_vaccinations)) %>% ungroup()
内容的提问来源于stack exchange,提问作者James Wheeler
相关产品推荐
相关产品推荐

