如何用R计算数据框Varietes列每个品种对应变量的相关性
R按品种分组计算指定变量相关性的实现方案
直接使用分组聚合的逻辑即可完成批量计算,无需手动拆分数据集,同时可封装为函数实现长期复用:
基础实现(仅输出相关系数和样本量)
首先加载依赖包:
install.packages("tidyverse") # 未安装时执行 library(dplyr)
计算代码:
# 按Varietes分组计算ASIi与Hauteur.des.pieds的皮尔逊相关系数 cor_result <- dataset3 %>% group_by(Varietes) %>% summarise( 相关系数 = cor(ASIi, Hauteur.des.pieds, use = "complete.obs"), 样本量 = n(), .groups = "drop" )
use = "complete.obs"参数会自动忽略分组内存在缺失值的行,避免计算报错。
可复用函数封装
将逻辑封装为函数,后续更换变量、更换数据集都无需重复写逻辑:
calc_group_cor <- function(data, group_col, var_x, var_y) { data %>% group_by(across({{ group_col }})) %>% summarise( 相关系数 = cor({{ var_x }}, {{ var_y }}, use = "complete.obs"), 样本量 = n(), .groups = "drop" ) }
调用示例:
# 计算ASIi和株高的分组相关 res1 <- calc_group_cor(dataset3, Varietes, ASIi, Hauteur.des.pieds) # 计算ASIi和穗位高的分组相关 res2 <- calc_group_cor(dataset3, Varietes, ASIi, Hauteur.des.soies)
带显著性检验的版本
如果需要输出相关性的p值,可以结合broom包提取检验结果:
library(broom) calc_group_cor_with_signif <- function(data, group_col, var_x, var_y) { data %>% group_by(across({{ group_col }})) %>% filter(n() >= 3) %>% # 过滤样本量小于3的分组,避免检验报错 summarise( cor_test = list(cor.test({{ var_x }}, {{ var_y }}, use = "complete.obs")), .groups = "drop" ) %>% unnest_wider(cor_test) %>% select( 品种 = {{ group_col }}, 相关系数 = estimate, p值 = p.value, 置信区间下限 = conf.low, 置信区间上限 = conf.high, 样本量 = parameter ) } # 调用 res_with_p <- calc_group_cor_with_signif(dataset3, Varietes, ASIi, Hauteur.des.pieds)
以上代码对品种数量无限制,即使真实数据集有50个以上品种,也可以一键完成计算,不需要额外修改代码逻辑。
内容的提问来源于stack exchange,提问作者Jean Mergnat
相关产品推荐
相关产品推荐

