如何用R补全长格式的不完整相关矩阵?
简洁填充对称相关矩阵的方法
针对你这个对称相关矩阵的填充需求,其实用tidyverse的工具就能轻松实现,不用复杂的逻辑。咱们一步步来:
首先,你已经通过complete()得到了包含所有x/y组合的完整表格,接下来只需要利用相关矩阵的对称性(cor(x,y)=cor(y,x)),把已有的非NA值复制到对称位置就行。
具体步骤:
- 从补全后的表格里提取所有非NA的行,交换它们的
x和y列,生成对称的补充行; - 把这些补充行和原表格合并,去重避免重复行;
- 最后按x/y排序,得到最终的对称矩阵。
代码实现:
假设你补全后的表格叫df_complete(就是你用complete()得到的9行tibble),运行以下代码:
library(dplyr) library(tidyr) # 生成对称补充行:交换非NA行的x和y symmetric_rows <- df_complete %>% filter(!is.na(z)) %>% rename(x = y, y = x) # 直接交换x和y列 # 合并、去重、排序得到最终矩阵 df_final <- bind_rows(df_complete, symmetric_rows) %>% distinct(x, y, .keep_all = TRUE) %>% arrange(x, y)
输出结果:
运行后你会得到和期望完全一致的表格:
# A tibble: 9 × 3 x y z <fct> <fct> <dbl> 1 A A NA 2 A B 1 3 A C 0 4 B A 1 5 B B NA 6 B C -1 7 C A 0 8 C B -1 9 C C NA
可选优化:
如果需要把对角线(x=y的位置)设为1(因为变量和自身的相关系数是1),只需要再加一步:
df_final <- df_final %>% mutate(z = if_else(x == y, 1, z))
这个方法完全利用tidyverse的管道操作,逻辑清晰简洁,比复杂的循环或者嵌套判断高效多了~
内容的提问来源于stack exchange,提问作者dputhier
相关产品推荐
相关产品推荐

