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

如何在R的dplyr分组中合并指定列生成组合新列?

问题:按ID分组并按对应关系拼接agency与bucket列

需要实现按ID分组折叠行,同时将每组内的agency与bucket按对应关系组合后合并为新列agency.bucket。之前尝试的dplyr代码只能分别对两列去重拼接,无法实现对应组合的效果:

df1 %>%
  dplyr::group_by(ID) %>%
  dplyr::mutate(
    agency = toString(unique(agency)),
    bucket = toString(unique(bucket))
  ) %>%
  dplyr::distinct()

输入数据

structure(list(ID = c(1, 1.1, 3.3, 3.3, 3.3, 3.3), time = c("M", 
"M", "M", "M", "M", "M"), restriction = c("18+", "18+", "N/A", 
"N/A", "N/A", "N/A"), county = c("Checked", "Checked", "Checked", 
"Checked", "Checked", "Checked"), zip_code = c("Checked", "Checked", 
NA, NA, NA, NA), age = c("Checked", "Checked", NA, NA, NA, NA
), delay = c("2 months", "2 months", "1 month", "1 month", "1 month", 
"1 month"), agency = c("SA", "Australia", "Africa", "Africa", 
"USA", "USA"), agency_response = c("Checked", "Checked", "Checked", 
"Checked", "Checked", "Checked"), bucket = c("DC", "DC", "Marvel", 
"Pixar", "Marvel", "Pixar"), bucket_response = c("Checked", "Checked", 
"Checked", "Checked", "Checked", "Checked")), class = "data.frame", row.names = c(NA, 
-6L)) 

期望输出

> df2
   ID time restriction  county zip_code     age    delay                agency.bucket
1 1.0    M         18+ Checked  Checked Checked 2 months                        SA:DC
2 1.1    M         18+ Checked  Checked Checked 2 months               Australia : DC
3 3.3    M         N/A Checked     <NA>    <NA>  1 month Africa: Marvel & USA : Pixar

解决方案

使用dplyr先对分组内的agency和bucket去重保留唯一配对,再拼接成指定格式:

library(dplyr)

df1 %>%
  group_by(ID) %>%
  # 保留每组内agency与bucket的唯一配对
  distinct(agency, bucket, .keep_all = FALSE) %>%
  # 将每对agency和bucket拼接为"XX: XX"格式
  mutate(pair = paste(agency, bucket, sep = ": ")) %>%
  # 合并所有配对并保留其他列的唯一值
  summarise(
    agency.bucket = paste(pair, collapse = " & "),
    across(c(time, restriction, county, zip_code, age, delay, agency_response, bucket_response), ~first(.x))
  ) %>%
  ungroup()

说明:

  • distinct(agency, bucket)确保同一ID下只保留agency和bucket的唯一组合,避免重复配对
  • paste(agency, bucket, sep = ": ")生成单个配对字符串
  • paste(pair, collapse = " & ")将所有配对用" & "连接成最终的agency.bucket列
  • across(..., ~first(.x))保留其他列的唯一值(同一ID下这些列值一致)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.14 09:40:29