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

在tidyverse/dplyr中实现保留主表全列的关联分组聚合

在tidyverse中实现类似SQL的关联聚合需求

你需要关联nests和nest_days,保留nests的全部列,同时添加nest_days按NestID分组后的Day最值,这里提供几种简洁优雅的tidyverse实现方式:

方法一:先聚合再关联(最贴近SQL逻辑)

把nest_days的聚合操作嵌入关联步骤,用管道串联后完全不需要拆分两步,写法简洁直观:

nests %>%
  # 用left_join保留nests所有行,仅需匹配行的话换成inner_join
  left_join(
    nest_days %>% 
      group_by(NestID) %>% 
      summarize(minDay = min(Day), maxDay = max(Day)),
    by = "NestID"
  )

方法二:关联后聚合并保留原表列

如果偏好先关联再聚合的逻辑,利用dplyr的特性:分组内唯一的列可以通过across结合first(或last)保留,同时过滤掉nest_days的冗余列:

nests %>%
  inner_join(nest_days, join_by(NestID)) %>%
  group_by(NestID) %>%
  summarize(
    # 保留nests的所有列(每个NestID下这些列唯一,取first不改变值)
    across(all_of(names(nests))),
    minDay = min(Day),
    maxDay = max(Day)
  ) %>%
  # 移除nest_days带来的同名冗余列(实际数据无同名列可省略)
  select(-any_of(c("a", "b", "c", "Day")))

方法三:优化你找到的nest_join方案

你之前的nest_join写法可以简化,直接提取列计算,代码更清爽:

nests %>%
  nest_join(nest_days, by = "NestID") %>%
  mutate(
    minDay = map_dbl(nest_days, ~.x$Day %>% min()),
    maxDay = map_dbl(nest_days, ~.x$Day %>% max())
  ) %>%
  select(-nest_days)

小提示

你的模拟数据中两个表有同名列(a/b/c),关联后会生成a.x/a.y这类重复列,实际业务中建议给不同表的同名列加前缀(比如nest_days的列改成nd_a),能让代码逻辑更清晰。

内容的提问来源于stack exchange,提问作者Tomas

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.13 15:42:40