在R中按月份分组计算指定列的相关性问题
问题描述
现有如下R数据框:
structure(list(Period = structure(c(2021.33333333333, 2021.41666666667, 2021.5, 2021.58333333333, 2021.66666666667, 2021.75, 2021.83333333333, 2021.91666666667, 2022, 2021.33333333333, 2021.41666666667, 2021.5, 2021.58333333333, 2021.66666666667, 2021.75, 2021.83333333333, 2021.91666666667, 2022, 2021.33333333333, 2021.41666666667), class = "yearmon"), `Bransch (SNI 2007)` = c("Livsmedelsindustri (SNI 10-12)", "Livsmedelsindustri (SNI 10-12)", "Livsmedelsindustri (SNI 10-12)", "Livsmedelsindustri (SNI 10-12)", "Livsmedelsindustri (SNI 10-12)", "Livsmedelsindustri (SNI 10-12)", "Livsmedelsindustri (SNI 10-12)", "Livsmedelsindustri (SNI 10-12)", "Livsmedelsindustri (SNI 10-12)", "Textilindustri (SNI 13-15)", "Textilindustri (SNI 13-15)", "Textilindustri (SNI 13-15)", "Textilindustri (SNI 13-15)", "Textilindustri (SNI 13-15)", "Textilindustri (SNI 13-15)", "Textilindustri (SNI 13-15)", "Textilindustri (SNI 13-15)", "Textilindustri (SNI 13-15)", "Trävaruindustri (SNI 16)", "Trävaruindustri (SNI 16)"), outcome = c(19, 19, 38, 19, 14, 39, 40, 29, 48, 32, 39, 44, 7, 0, 2, 22, 1, -26, 38, 37), expectations = c(41, 39, 33, 28, 21, 38, 15, 27, 14, 35, 36, 36, 53, 41, 24, 36, 11, 54, 32, 33), predict = c(-4, -4, -6, -9, -10, 9, -18, -7, -28, 9, 8, -1, 19, -10, 17, -3, -5, 2, 2, -2), corr = c(NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA)), row.names = c(NA, 20L), class = c("tbl_df", "tbl", "data.frame"))
需求是按Period(yearmon类型)分组,分别计算每组内:
outcome与predict的相关性expectations与predict的相关性
此前尝试的代码:
ifelse(data$Period == 'maj 2021', cor(data$outcome, data$predict), NA)
该代码错误地计算了全样本的相关性并赋值给对应月份的行,而非仅该月份内观测的相关性。
解决方案
方法1:使用dplyr包(推荐)
通过group_by()按Period分组,再用mutate()添加分组内的相关系数列:
library(dplyr) # 加载数据框(假设数据框名为df) df <- structure(...) # 替换为你的数据框结构 df_result <- df %>% group_by(Period) %>% mutate( corr_outcome_predict = cor(outcome, predict, use = "complete.obs"), corr_expectations_predict = cor(expectations, predict, use = "complete.obs") ) %>% ungroup()
use = "complete.obs"用于处理分组内可能存在的NA值,确保计算有效。- 运行后,数据框会新增两列,分别对应每组内的两个相关系数。
方法2:使用Base R
用ave()函数实现分组计算,无需额外包:
# 加载数据框 df <- structure(...) # 计算分组内outcome与predict的相关性 df$corr_outcome_predict <- ave(df$outcome, df$Period, FUN = function(x) cor(x, df$predict[df$Period == unique(df$Period)], use = "complete.obs")) # 计算分组内expectations与predict的相关性 df$corr_expectations_predict <- ave(df$expectations, df$Period, FUN = function(x) cor(x, df$predict[df$Period == unique(df$Period)], use = "complete.obs"))
ave()会按Period分组,对每组的目标变量应用自定义函数计算相关系数。- 注意需要在函数内匹配对应分组的
predict值。
内容的提问来源于stack exchange,提问作者TerribleStudent
相关产品推荐
相关产品推荐

