如何用dplyr包在R中计算各组内变量间的相关性
问题描述
首先构造目标数据框:
var2 = c(rep("A",3),rep("B",3),rep("C",3),rep("D",3),rep("E",3),rep("F",3), rep("H",3),rep("I",3)) y2 = c(-1.23, -0.983, 1.28, -0.268, -0.46, -1.23, 1.87, 0.416, -1.99, 0.289, 1.7, -0.455, -0.648, 0.376, -0.887,0.534,-0.679,-0.923, 0.987,0.324,-0.783,-0.679,0.326,0.998);length(y2) group2 = c(rep(1,6),rep(2,6),rep(3,6),rep(1,6)) data2 = tibble(var2,group2,y2)
数据预览:
# A tibble: 24 × 3 var2 group2 y2 <chr> <dbl> <dbl> 1 A 1 -1.23 2 A 1 -0.983 3 A 1 1.28 4 B 1 -0.268 5 B 1 -0.46 6 B 1 -1.23 7 C 2 1.87 8 C 2 0.416 9 C 2 -1.99 10 D 2 0.289 11 D 2 1.7 12 D 2 -0.455 13 E 3 -0.648 14 E 3 0.376 15 E 3 -0.887 16 F 3 0.534 17 F 3 -0.679 18 F 3 -0.923 19 H 1 0.987 20 H 1 0.324 21 H 1 -0.783 22 I 1 -0.679 23 I 1 0.326 24 I 1 0.998
需求:使用dplyr包计算每个分组内所有不同变量对的相关性,得到如下格式的结果表:
| group | var1 | var2 | value |
|---|---|---|---|
| 1 | A | B | cor(A,B) |
| 1 | A | H | cor(A,H) |
| 1 | A | I | cor(A,I) |
| 1 | B | H | cor(B,H) |
| 1 | B | I | cor(B,I) |
| 1 | H | I | cor(H,I) |
| 2 | C | D | cor(C,D) |
| 3 | E | F | cor(E,F) |
解决方案
结合dplyr和tidyr包实现,步骤如下:
- 加载所需包:
library(dplyr) library(tidyr)
- 执行计算代码:
result <- data2 %>% # 按分组拆分数据 group_by(group2) %>% # 长格式转宽格式,每个var2对应一列y2值 pivot_wider(names_from = var2, values_from = y2) %>% # 生成每个分组的相关性矩阵 mutate(cor_matrix = list(cor(select(., -group2), use = "pairwise.complete.obs"))) %>% # 将相关性矩阵转为长格式数据 rowwise() %>% mutate(cor_long = list(as.data.frame(cor_matrix) %>% rownames_to_column("var1"))) %>% unnest(cor_long) %>% # 进一步转换为var1-var2-相关系数的长格式 pivot_longer(cols = -c(group2, var1), names_to = "var2", values_to = "value") %>% # 过滤自身相关和重复变量对(仅保留var1 < var2的组合) filter(var1 < var2) %>% # 调整列名和顺序 rename(group = group2) %>% select(group, var1, var2, value) %>% ungroup()
- 查看结果:
print(result)
运行后即可得到符合要求的结果表,value列对应变量对的皮尔逊相关系数。若数据无缺失值,可省略cor()函数中的use = "pairwise.complete.obs"参数。
内容的提问来源于stack exchange,提问作者Homer Jay Simpson
相关产品推荐
相关产品推荐

