不同样本量DataFrame按模态分组计算变量相关性的实现方法
按分组模态计算两个DataFrame的相关性(适配样本量差异)
核心需求实现
针对两个包含分组列v1和数值列v2的DataFrame,自动按v1的所有模态分组,对每个分组先以样本量较小的DataFrame为准截断v2向量,再计算相关性,无需手动逐个处理数百种模态。
方法一:使用tidyverse(推荐,批量处理更简洁)
library(tidyverse) # 为两个数据框添加来源标识,方便后续区分 df1 <- df1 %>% mutate(source = "df1") df2 <- df2 %>% mutate(source = "df2") # 合并数据、分组处理、计算相关性 combined_result <- bind_rows(df1, df2) %>% group_by(v1) %>% nest() %>% mutate( # 提取各分组下两个数据框的v2向量 df1_v2 = map(data, ~ .x %>% filter(source == "df1") %>% pull(v2)), df2_v2 = map(data, ~ .x %>% filter(source == "df2") %>% pull(v2)), # 计算当前分组的最小样本量 min_sample = map2_dbl(df1_v2, df2_v2, ~ min(length(.x), length(.y))), # 截断向量至最小样本量 truncated_df1 = map2(df1_v2, min_sample, ~ .x[1:.y]), truncated_df2 = map2(df2_v2, min_sample, ~ .x[1:.y]), # 计算皮尔逊相关性,样本量不足2时返回NA避免报错 pearson_cor = map2_dbl(truncated_df1, truncated_df2, ~ ifelse(length(.x) < 2, NA, cor(.x, .y))) ) %>% # 保留关键结果列 select(v1, min_sample, pearson_cor) # 查看最终结果 print(combined_result)
说明
- 自动遍历所有
v1模态,无需手动指定 - 支持切换相关性方法:如需斯皮尔曼相关,将
cor(.x, .y)改为cor(.x, .y, method = "spearman") - 自动处理样本量不足的情况,避免计算报错
方法二:使用Base R(无需额外包)
# 获取两个数据框共有的模态 shared_groups <- intersect(unique(df1$v1), unique(df2$v1)) # 初始化结果存储数据框 result_df <- data.frame( v1 = character(), min_sample = integer(), pearson_cor = numeric(), stringsAsFactors = FALSE ) # 循环处理每个共有模态 for (group in shared_groups) { # 提取当前模态的v2数据 df1_vals <- df1$v2[df1$v1 == group] df2_vals <- df2$v2[df2$v1 == group] # 确定最小样本量并截断 min_n <- min(length(df1_vals), length(df2_vals)) df1_trunc <- df1_vals[1:min_n] df2_trunc <- df2_vals[1:min_n] # 计算相关性,样本量不足时返回NA corr_val <- if (min_n < 2) NA else cor(df1_trunc, df2_trunc) # 将结果添加到数据框 result_df <- rbind(result_df, data.frame( v1 = group, min_sample = min_n, pearson_cor = corr_val )) } # 查看结果 print(result_df)
说明
- 无需加载任何第三方包,适合轻量化场景
- 仅处理两个数据框都存在的模态,避免无效计算
内容的提问来源于stack exchange,提问作者Achille Nyouma
相关产品推荐
相关产品推荐

