使用dplyr按ID统计采购数据并生成指定汇总表的技术求助
使用dplyr按ID统计采购数据并生成指定汇总表
我帮你完善了dplyr管道代码,完全符合你需要的汇总逻辑,同时优化了代码的可读性和效率:
library(dplyr) actions %>% # 重构purchases列的生成逻辑,用case_when替代嵌套ifelse更清晰 mutate(purchases = case_when( type == "Buy" & (obj_category %in% c("Books", "Car", "Business") | type == "Buy") ~ "need", type == "Buy" & (obj_category %in% c("Sweets", "Electronics", "House", "Business")) ~ "want", TRUE ~ "none" )) %>% # 按ID分组后,务必按time排序,保证能拿到**首次**采购的记录 group_by(id) %>% arrange(time, .by_group = TRUE) %>% summarise( # 统计need和want的数量 need = sum(purchases == "need"), want = sum(purchases == "want"), # total是排除none后的总采购数,直接用need+want即可 total = need + want, # 提取首次非none的采购类型,无采购则返回NA first_purchase = first(purchases[purchases != "none"], default = NA), # 根据首次采购类型生成output列 output = case_when( is.na(first_purchase) ~ "none", first_purchase == "need" ~ "yes", TRUE ~ "no" ) ) %>% # 调整列顺序匹配你的期望输出 select(id, total, need, want, output)
代码关键点说明:
- 用
case_when替代嵌套ifelse:让多条件判断的逻辑更直观,也更容易维护; - 分组后按
time排序:这是确保"首次采购"判断准确的核心,必须保证记录按时间顺序排列; - 统计数量用
sum():直接统计符合条件的行数,比逐行ifelse然后求和更高效; first()函数配合default = NA:轻松提取每个ID的首次有效采购记录,没有采购时返回NA,方便后续判断output;- 最后用
select调整列顺序,完全匹配你给出的期望输出格式。
对比你原来的代码,这个版本补上了total的计算、output的逻辑判断,同时优化了整体的代码结构,直接嵌入你的dplyr管道就能运行。
内容的提问来源于stack exchange,提问作者Eman
相关产品推荐
相关产品推荐

