按分组计算变量唯一组合的相关性:寻求高效实现方法
分组计算多变量两两相关性的高效方法
你当前手动指定变量组合的方法在变量增多时会非常繁琐,而第二种代码报错的原因是:在group_by后的summarise中直接调用df[,2:ncol(df)]会引用整个原始数据框,而非当前分组的子集,同时cor()返回的矩阵不符合summarise对单一值输出的要求。
以下是两种可扩展的解决方案,无需手动枚举变量组合:
方法1:转长格式后生成变量对计算
library(dplyr) library(tidyr) library(tibble) set.seed(13) df <- data.frame(group = rep(LETTERS[1:3], 3), var1 = rnorm(9, 1), var2 = rnorm(9, 2), var3 = rnorm(9, 1)) df %>% # 将数值变量转为长格式 pivot_longer(cols = -group, names_to = "var", values_to = "value") %>% group_by(group) %>% # 生成当前分组内所有不重复的变量对 summarise(var_pairs = list(t(combn(unique(var), 2))), .groups = "drop") %>% # 展开变量对为单独列 unnest(var_pairs) %>% rename(var1 = var_pairs1, var2 = var_pairs2) %>% # 关联原数据的变量值 left_join(df %>% pivot_longer(-group, names_to = "var1", values_to = "val1"), by = c("group", "var1")) %>% left_join(df %>% pivot_longer(-group, names_to = "var2", values_to = "val2"), by = c("group", "var2")) %>% # 按分组和变量对计算相关性 group_by(group, var1, var2) %>% summarise(correlation = cor(val1, val2), .groups = "drop")
方法2:用group_modify处理分组相关矩阵
这种方法直接对每个分组的数值变量计算相关矩阵,再整理为整洁格式:
df %>% group_by(group) %>% group_modify(~ { # 提取当前分组的数值变量 num_vars <- select(.x, -group) # 计算相关矩阵并转为整洁格式 cor(num_vars) %>% as.data.frame() %>% rownames_to_column("var1") %>% pivot_longer(cols = -var1, names_to = "var2", values_to = "correlation") %>% # 仅保留上三角结果,避免重复(如var1-var2和var2-var1) filter(var1 < var2) }) %>% ungroup()
原代码的问题修正
如果想保留矩阵形式的结果,可改用cur_data()获取当前分组数据,但结果需进一步整理:
df %>% group_by(group) %>% summarise(cor_mat = list(cor(cur_data()[,-1])), .groups = "drop")
内容的提问来源于stack exchange,提问作者mmw
相关产品推荐
相关产品推荐

