如何用R的dplyr::pivot_wider生成表间列名匹配计数矩阵?
生成表间列匹配数矩阵的解决方案
核心代码实现
library(tidyverse) # 一步生成目标矩阵 result <- df %>% # 按表名分组,将每个表的列打包成列表 group_by(table_name) %>% summarize(cols = list(column_name), .groups = "drop") %>% # 生成所有表的两两组合(包含自身) cross_join(., ., suffix = c("_x", "_y")) %>% # 计算每对表的共同列数量 mutate(match_num = map2_int(cols_x, cols_y, ~length(intersect(.x, .y)))) %>% # 保留需要的字段 select(table_name_x, table_name_y, match_num) %>% # 转换为宽格式 pivot_wider(names_from = table_name_y, values_from = match_num) %>% # 将表名设为行名 column_to_rownames("table_name_x") # 查看结果 result
运行后输出:
tbl1 tbl2 tbl3 tbl1 3 1 0 tbl2 1 3 2 tbl3 0 2 3
分步解释
- 整理列集合:按
table_name分组,把每个表对应的所有column_name存为列表,方便后续计算列的交集。 - 生成表对组合:用
cross_join生成所有表的笛卡尔积组合,覆盖每个表与自身、不同表之间的双向配对,保证最终矩阵的对称性。 - 统计匹配列数:通过
map2_int遍历每一对列列表,用intersect提取共同列并统计长度,得到每对表的匹配列数量。 - 转换为矩阵格式:用
pivot_wider把长格式的匹配数转为宽格式,最后将行名设置为表名,得到符合需求的矩阵。
内容的提问来源于stack exchange,提问作者Thanatocoenose
相关产品推荐
相关产品推荐

