在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
相关产品推荐
相关产品推荐

