You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.29 02:36:06