R语言按年月分组计算变量相关系数并存储结果的实现问题
实现思路
直接在group_by后调用cor无法生效的原因是dplyr分组聚合默认返回标量结果,而cor函数返回的是矩阵类结果,需要先对每组数据打包后逐组计算。
方法1:tidyverse 实现(可读性高)
首先加载依赖包:
library(tidyverse)
生成嵌套列表格式结果(每个元素为对应年月的相关系数矩阵)
cor_result_list <- df %>% # 按Year、Month分组,每组数据打包为独立子集 nest_by(Year, Month) %>% mutate( # 逐组计算斯皮尔曼相关,按指定规则处理NA值 cor_matrix = list( cor(data, method = "spearman", use = "pairwise.complete.obs") ) ) %>% # 提取相关矩阵列表并按 年-月 命名 pull(cor_matrix, name = paste(Year, Month, sep = "-"))
调用示例:提取2017年1月的相关系数矩阵,直接执行cor_result_list[["2017-1"]]即可。
生成长格式数据框结果
如果需要将相关系数转为二变量对应的长表格式,可使用以下代码:
cor_long_df <- df %>% nest_by(Year, Month) %>% reframe( broom::tidy(cor(data, method = "spearman", use = "pairwise.complete.obs")) )
如果需要按年月拆分为独立数据框列表,可追加:
cor_df_list <- cor_long_df %>% mutate(group = paste(Year, Month, sep = "-")) %>% group_split(group, .keep = FALSE) names(cor_df_list) <- unique(paste(cor_long_df$Year, cor_long_df$Month, sep = "-"))
方法2:基础R实现(无需额外安装包)
# 按Year、Month拆分原数据框 split_df <- split(df, f = list(df$Year, df$Month), sep = "-", drop = TRUE) # 遍历每个分组计算相关系数,自动移除分组字段 cor_list <- lapply(split_df, function(sub_df) { num_cols <- sub_df[, setdiff(colnames(sub_df), c("Year", "Month"))] cor(num_cols, method = "spearman", use = "pairwise.complete.obs") })
调用示例:cor_list[["2017-1"]]即可提取对应年月的相关系数矩阵。
内容的提问来源于stack exchange,提问作者LeMarque
相关产品推荐
相关产品推荐

