如何在R中按日期和地点生成姓名列的两两组合
在R中按日期和地点分组生成姓名两两组合列
直接用tidyverse工具链就能完成需求,核心是先拆分逗号分隔的姓名,再按分组生成两两组合,最后转成宽格式补全NA:
library(tidyverse) # 原始数据 df <- tribble( ~date, ~place, ~names, "2022-02-10", "a", "Luis Smith,Johan Devi,Lia Ivanov,Rui Kim", "2022-02-11", "b", "Luis Smith,Lia Ivanov,Rui Kim", "2022-02-12", "c", "Luis Smith,Johan Devi,Rui Kim", ) # 处理代码 result <- df %>% group_by(date, place, names) %>% # 拆分姓名为向量,生成两两组合并存为列表列 mutate(pairs = list( combn(str_split(names, ",\\s*")[[1]], 2, paste, collapse = ", ") )) %>% # 展开列表列并记录组合索引 unnest_longer(pairs, indices_to = "col_idx") %>% # 转宽格式,自动生成x1-xN列,不足补NA pivot_wider( names_from = col_idx, names_prefix = "x", values_from = pairs, values_fill = NA_character_ ) %>% ungroup() # 输出结果 print(result)
关键步骤说明
- 拆分姓名列:
str_split(names, ",\\s*")[[1]]把逗号分隔的姓名拆成无多余空格的字符向量,这是你之前遗漏的核心步骤——直接用原names字符串喂给combn只会把整个字符串当成单个元素,无法生成有效组合; - 生成两两组合:
combn(..., 2, paste, collapse = ", ")对每个分组的姓名向量生成所有不重复的两两配对,同时用逗号加空格拼接成字符串; - 转宽格式补NA:
pivot_wider自动根据最大组合数生成x1到xN的列,分组内组合数不足的位置用NA填充,完全匹配你要的输出格式。
内容的提问来源于stack exchange,提问作者Johan
相关产品推荐
相关产品推荐

