如何使用dplyr对分组数据生成所有变量的全相关矩阵
报错原因
你之前代码报错的核心原因是group_by分组后,传入cor()的.指代当前分组的全量数据,包含非数值类型的分组列Group,不符合cor()要求输入全数值矩阵/数据框的规则。
最简实现方案
基于dplyr 1.0.0及以上版本,使用pick()排除分组列即可实现分组计算全因子相关矩阵:
library(dplyr) numRows <- 20 myData <- tibble(A = rnorm(numRows), B = rnorm(numRows), C = rnorm(numRows), Group = c(rep("Group1", numRows/2), rep("Group2", numRows/2))) # 分组计算全因子相关矩阵 cor_result <- myData %>% group_by(Group) %>% summarise(CorMat = list(cor(pick(-Group))))
最终输出的cor_result是包含两列的tibble:Group为分组标识,CorMat是列表列,每个元素对应分组的相关系数矩阵,可以直接用cor_result$CorMat[[1]]取出第一个分组的矩阵使用。
拓展:输出两两配对长表
如果需要把相关矩阵展开为变量两两配对的长格式方便后续分析,可以用如下写法:
cor_long <- myData %>% group_by(Group) %>% summarise(as.data.frame(as.table(cor(pick(-Group)))))
输出的长表默认包含Var1、Var2、Freq三列,分别代表第一个变量名、第二个变量名、对应相关系数,可按需重命名列名。
兼容性写法(适配低版本dplyr)
如果你的dplyr版本低于1.0.0不支持pick(),可以用across()自动识别数值列实现相同效果:
cor_result <- myData %>% group_by(Group) %>% summarise(CorMat = list(cor(across(where(is.numeric)))))
可选:nest_by实现逻辑更清晰
如果需要在分组后做更多自定义运算,用nest_by打包分组数据的写法可读性更强:
cor_result <- myData %>% nest_by(Group) %>% mutate(CorMat = list(cor(data))) %>% select(-data)
内容的提问来源于stack exchange,提问作者Andreas
相关产品推荐
相关产品推荐

