如何用tidyverse为每个特征与分组变量做Spearman相关性分析?
解决方案
你的问题核心在于分组变量car_group是分类类型,而Spearman相关性分析要求两个输入变量都是数值型。另外你原代码的nest逻辑有误,应该按特征分组后再嵌套数据。下面是两种可行的实现方法:
方法一:修正你的原代码逻辑
library(tidyverse) library(broom) data %>% # 将分类分组变量转为数值型(A→1,B→2) mutate(car_group_num = as.integer(factor(car_group))) %>% # 把特征列转为长格式 pivot_longer(!c(car_group, car_group_num), names_to = 'Feature', values_to = 'value') %>% # 按特征分组后嵌套数据 group_by(Feature) %>% nest() %>% # 对每个嵌套数据集做Spearman相关性分析 mutate( fit = map(data, ~cor.test(.x$value, .x$car_group_num, method = 'spearman')), tidied = map(fit, tidy) ) %>% # 展开结果 unnest(tidied) %>% # 可选:保留核心结果列 select(Feature, estimate, p.value, method)
方法二:直接遍历特征列(更简洁)
不需要转长格式,直接用map_dfr遍历所有特征列,逐个与编码后的分组变量做相关性分析:
library(tidyverse) library(broom) # 先编码分组变量为数值型 data$car_group_num <- as.integer(factor(data$car_group)) # 遍历所有特征列(排除最后一列原分组变量) map_dfr(names(data)[1:(ncol(data)-1)], function(col) { cor_result <- cor.test(data[[col]], data$car_group_num, method = 'spearman') tidy(cor_result) %>% mutate(Feature = col) %>% select(Feature, estimate, p.value, method) })
关键说明
- 分类变量转数值:用
as.integer(factor(car_group))将A/B转为1/2,Spearman相关性基于秩次计算,这种编码方式不会影响结果的合理性。 - 原代码
nest(Feature)错误:必须先按Feature分组,再嵌套对应的数据行,这样每个嵌套数据集才对应一个特征的所有观测值。
内容的提问来源于stack exchange,提问作者Mdhale
相关产品推荐
相关产品推荐

