如何使用tidyverse将dataframe两列转换为方阵格式数据框
tidyverse实现长表转对称相关系数方阵
核心实现逻辑分三步:
- 提取
Factor_1的唯一取值作为方阵的行、列维度基准,过滤掉Factor_2中不属于该集合的冗余因子(比如样例中的d) - 调用
tidyr::pivot_wider完成长表到宽表的结构转换 - 调整列顺序和行顺序匹配,按需将第一列转为行名即可得到目标方阵
完整可复现代码
library(tidyverse) # 构造示例数据 cor_df <- tibble( Factor_1 = c("a","a","a","b","b","a","b","b","c","c","c","c"), Factor_2 = c("b","a","d","c","b","c","d","a","a","c","d","b"), value = c(0.8,1,0.6,0.4,1,0.2,0.75,0.8,0.2,1,0.1,0.4) ) # 执行转换 target_factors <- unique(cor_df$Factor_1) cor_matrix <- cor_df %>% filter(Factor_2 %in% target_factors) %>% pivot_wider( id_cols = Factor_1, names_from = Factor_2, values_from = value ) %>% select(Factor_1, all_of(target_factors)) %>% column_to_rownames(var = "Factor_1")
输出结果
运行后cor_matrix的输出和目标效果完全一致:
a b c a 1.0 0.8 0.2 b 0.8 1.0 0.4 c 0.2 0.4 1.0
补充说明
- 原始数据中已经包含因子自相关值为1的记录,无需额外手动填充对角线
- 如果后续遇到相关系数配对缺失(比如仅存储了a-b的相关值,未存储b-a的对应值),可以在过滤步骤后增加对称补全逻辑,当前样例数据配对完整可直接运行
- 如果需要保留tibble格式,删除最后一步
column_to_rownames即可,第一列会保留因子名称。
内容的提问来源于stack exchange,提问作者JEJI
相关产品推荐
相关产品推荐

