如何在R语言中按变量分组后计算组间列的相关性?
按分组计算不同组间列的相关性(R语言)
核心思路
先将分组后的目标列转换为宽格式(每个组作为一列),再计算列间的相关性,最后整理为表格形式输出。以下结合你的现有代码prep_cor,分两种场景给出解决方案:
场景1:计算指定两组的相关性
比如你需要计算Sheet组中"A"与"B"的BLUE列相关性(对应你例子中2000年与2010年的Var列相关):
library(tidyverse) library(broom) # 提取指定组数据并转换为宽格式(行对齐保证数据匹配) target_cor_data <- prep_cor %>% filter(Sheet %in% c("A", "B")) %>% # 替换为你需要的组名/年份 mutate(row_id = row_number()) %>% # 添加行ID确保两组行对齐 pivot_wider(names_from = Sheet, values_from = BLUE) %>% select(-row_id) # 计算相关性并转为表格 specific_cor_result <- cor(target_cor_data, use = "pairwise.complete.obs") %>% tidy() %>% filter(row == "A" & column == "B") # 筛选目标组的相关结果 # 输出表格 print(specific_cor_result)
场景2:计算所有组两两之间的相关性表格
如果需要输出所有Sheet组间BLUE列的两两相关系数表格:
# 将分组数据转为宽格式 wide_group_data <- prep_cor %>% mutate(row_id = row_number()) %>% pivot_wider(names_from = Sheet, values_from = BLUE) %>% select(-row_id) # 计算全量相关矩阵并转为整洁表格 all_pair_cor <- cor(wide_group_data, use = "pairwise.complete.obs") %>% tidy() %>% arrange(row, column) # 可选:转为宽表格更直观展示 all_pair_cor_wide <- all_pair_cor %>% pivot_wider(names_from = column, values_from = estimate) # 输出结果 print(all_pair_cor_wide)
适配你的原始例子(Year分组+Var列)
如果是按Year分组,计算2000与2010年Var列的相关性,只需替换对应变量名:
# 基于原始数据的预处理(对应你的prep_cor逻辑) prep_cor_year <- original_df %>% group_by(Year) %>% slice_sample(n=600) %>% arrange(Year, desc(Var)) # 计算2000 vs 2010的相关性 cor_year_result <- prep_cor_year %>% filter(Year %in% c(2000, 2010)) %>% mutate(row_id = row_number()) %>% pivot_wider(names_from = Year, values_from = Var) %>% select(-row_id) %>% cor(use = "pairwise.complete.obs") %>% tidy() %>% filter(row == 2000 & column == 2010) print(cor_year_result)
关键说明
mutate(row_id = row_number()):因为你每组抽样了600行,添加行ID可以保证转宽格式时两组数据严格对齐,避免错位。use = "pairwise.complete.obs":自动跳过缺失值,仅使用两组都有有效数据的行计算相关性。broom::tidy():将传统的相关矩阵转换为符合tidy data标准的表格,方便后续分析或导出。
内容的提问来源于stack exchange,提问作者R_B
相关产品推荐
相关产品推荐

