You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.08 07:40:09