基于双分组的变量相关性计算:tidy方法的高效实现问询
分组计算多变量与目标变量的相关系数解决方案
问题回顾
需要按id和Grp双层分组,计算每组中target与var1、var2的相关系数,最终得到4行2列的结果。之前的两种方法存在以下问题:
- 直接在
summarise中使用c(var1,var2)会导致向量长度不匹配,触发报错; - 自定义函数直接调用时未针对分组数据处理,返回的是全局计算结果。
正确实现方法
方法1:使用dplyr::summarise + across(推荐)
这是最简洁的tidy风格写法,直接遍历目标变量计算相关系数:
library(dplyr) set.seed(123) example=data.frame( id = c(rep(1,20),rep(2,20)), # 一级分组 Grp = rep(c(rep('A',10),rep('B',10)),2), # 二级分组 target = c(rep(1:10,2), rep(20:11,2)), var1 = sample(1:100,40,replace=TRUE), var2 =sample(1:100,40,replace=TRUE) ) # 分组计算相关系数 result <- example %>% group_by(id, Grp) %>% summarise( # 遍历var1、var2,分别与target计算相关系数 across(c(var1, var2), ~cor(target, .x)), .groups = "drop" # 计算完成后取消分组 ) print(result)
输出结果示例:
# A tibble: 4 × 4 id Grp var1 var2 <dbl> <chr> <dbl> <dbl> 1 1 A -0.240 -0.188 2 1 B -0.174 0.271 3 2 A 0.440 0.129 4 2 B 0.690 0.421
方法2:修复自定义函数并结合group_map
如果需要保留自定义函数,可以用group_map对每个分组应用函数:
library(dplyr) library(tibble) library(tidyr) # 定义返回数据框的自定义函数 corr_analisis_e <- function(df){ tibble( var1 = cor(df$target, df$var1), var2 = cor(df$target, df$var2) ) } # 分组应用函数并合并结果 result2 <- example %>% group_by(id, Grp) %>% group_map(corr_analisis_e) %>% # 对每个分组应用函数 bind_rows(.id = "group") %>% # 合并结果 separate(group, into = c("id", "Grp"), convert = TRUE) # 拆分分组标识为原字段 print(result2)
错误原因解析
- 长度错误问题:
c(var1,var2)会把var1和var2的所有元素拼接成一个长度为20的向量,而每个分组的target长度仅为10,cor()函数要求两个输入向量长度一致,因此触发报错。 - 全局结果问题:直接在分组后调用自定义函数时,函数接收的是完整的原始数据集而非分组后的子数据框,因此返回全局相关系数。必须使用
group_map或do()这类专门处理分组数据的函数,才能让函数作用于每个分组。
内容的提问来源于stack exchange,提问作者RobertoT
相关产品推荐
相关产品推荐

