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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.03 09:27:03