在R语言中按id分组并满足ispurchase==1条件时对dollvalue字段求和的问题求助
解决方案:按id分组求和符合条件的dollvalue
让我来帮你搞定这个需求!你想要的是筛选出ispurchase == 1的记录,再按id分组对dollvalue字段求和对吧?先拆解你之前代码的问题,再给你几个高效可行的方案:
为什么你的代码出错了?
第一个错误(plyr+dplyr混合使用):你把dplyr的
group_by和base R的aggregate混在一起用了,而且aggregate的参数写法完全错误——aggregate不需要和group_by搭配,你写的purchcost = sum(dollvalue[ispurchase==1], FUN = sum)逻辑混乱,导致R找不到FUN参数,所以报错。第二个错误(aggregate长度不匹配):你用
roundtrips$dollvalue[roundtrips$ispurchase==1]作为x(筛选后的数值),但by = list(roundtrips$id)是原数据的所有id,两者长度不一样(筛选后行数更少),自然会报arguments must have same length的错误。
高效可行的解决方案
方案1:用dplyr(推荐,语法清晰易读)
dplyr是tidyverse生态里的工具,比plyr更现代,管道操作%>%能让逻辑一目了然:
library(dplyr) # 步骤:筛选符合条件的行 → 按id分组 → 求和 returntrip <- roundtrips %>% filter(ispurchase == 1) %>% group_by(id) %>% summarize(total_dollvalue = sum(dollvalue, na.rm = TRUE)) %>% # na.rm=TRUE避免NA导致求和结果为NA ungroup()
方案2:用base R的aggregate(无需额外包)
两种正确写法,任选其一:
写法A:先筛选数据再聚合
# 先筛选出ispurchase==1的行 filtered_data <- roundtrips[roundtrips$ispurchase == 1, ] # 按id分组求和dollvalue returntrip <- aggregate(dollvalue ~ id, data = filtered_data, FUN = sum, na.rm = TRUE)
写法B:直接在aggregate中使用subset参数
returntrip <- aggregate( dollvalue ~ id, data = roundtrips, subset = ispurchase == 1, FUN = sum, na.rm = TRUE )
方案3:用data.table(大数据场景首选,速度极快)
如果你的数据量很大,data.table的性能会比dplyr和base R好很多:
library(data.table) # 把普通数据框转成data.table(如果还不是的话) setDT(roundtrips) # 语法逻辑:[行筛选, 列计算, 分组依据] returntrip <- roundtrips[ispurchase == 1, .(total_dollvalue = sum(dollvalue, na.rm = TRUE)), by = id]
这些方案都能准确实现你的需求,你可以根据自己的习惯和数据规模选择合适的方法~
内容的提问来源于stack exchange,提问作者magisterludi
相关产品推荐
相关产品推荐

