You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.28 23:22:33