如何用lapply替代嵌套for循环计算两个数据框的相关性?
用lapply实现两数据框列组合的相关性分析
需求说明
计算两个数据框(df1:10行15列,df2:10行20列)所有列组合的Spearman相关性,输出包含estimate(估计值)、statistic(统计量)、**p.value(P值)**的结果表,行名为aX:bY的列组合格式。
数据构造
set.seed(123) # 设置种子保证结果可复现 df1 <- as.data.frame(matrix(runif(10*15, -1, 1), ncol=15)) df2 <- as.data.frame(matrix(runif(10*20, -1, 1), ncol=20)) colnames(df1) <- paste0("a", 1:ncol(df1)) colnames(df2) <- paste0("b", 1:ncol(df2)) combo <- expand.grid(colnames(df1), colnames(df2)) # 生成所有列组合,共300组
lapply实现方案
核心思路是用lapply遍历所有列组合,对每组列执行相关性检验,提取目标指标后整合成结果表:
# 定义需要提取的指标 stats_to_extract <- c("estimate", "statistic", "p.value") # 用lapply遍历每个列组合 result_list <- lapply(1:nrow(combo), function(i) { col1 <- combo[i, 1] col2 <- combo[i, 2] # 执行Spearman相关性检验 test_res <- cor.test(df1[[col1]], df2[[col2]], method = "spearman") # 提取指定指标并转为向量 unlist(test_res[stats_to_extract]) }) # 将列表转为数据框 result_df <- do.call(rbind, result_list) # 设置行名为列组合格式 rownames(result_df) <- paste(combo[,1], combo[,2], sep = ":") # 查看前几行结果 head(result_df)
结果示例
输出的结果表结构如下(示例前4行):
estimate rho statistic S p.value a1:b1 -0.1428571 -0.4264014 0.7003825 a1:b2 0.3571429 1.1135531 0.2907474 a1:b3 0.1428571 0.4264014 0.7003825 a1:b4 -0.2857143 -0.8703883 0.4087572
内容的提问来源于stack exchange,提问作者pemb_bex6789
相关产品推荐
相关产品推荐

