如何在R中循环计算list.paired变量组合对应longdat向量的相关性?
解决遍历变量组合计算相关性的问题
我明白你现在的需求:已经用expand.grid生成了所有变量的配对组合,想要循环每一组计算对应向量的相关性,但之前的写法没成功。其实不用eval(parse)这种容易出错的方式,我们可以用更安全的列提取方法来实现,下面给你几种可行的方案:
先准备可复现的示例数据
首先我们先构造模拟数据,方便你测试代码:
set.seed(123) # 固定随机种子,保证结果一致 # 创建包含7个measure的数据集 longdat <- data.frame( measure1 = rnorm(100), measure2 = rnorm(100), measure3 = rnorm(100), measure4 = rnorm(100), measure5 = rnorm(100), measure6 = rnorm(100), measure7 = rnorm(100) ) # 生成所有变量的配对组合 list.paired <- expand.grid( Var1 = names(longdat), Var2 = names(longdat), stringsAsFactors = FALSE )
方案1:基础for循环(直观易理解)
这种方式最直观,适合新手调试:
# 新增一列存储相关性结果 list.paired$correlation <- NA # 遍历每一行计算相关性 for(i in 1:nrow(list.paired)){ # 用[[安全提取对应列的向量(比eval(parse)可靠得多) x <- longdat[[list.paired$Var1[i]]] y <- longdat[[list.paired$Var2[i]]] # 计算相关性,use参数用来处理缺失值(根据你的数据情况调整) list.paired$correlation[i] <- cor(x, y, use = "complete.obs") }
方案2:apply函数(简洁高效)
如果不想写for循环,用apply一行就能搞定:
list.paired$correlation <- apply(list.paired, 1, function(row){ x <- longdat[[row[1]]] y <- longdat[[row[2]]] cor(x, y, use = "complete.obs") })
方案3:tidyverse风格(更符合现代R语法)
如果你习惯用dplyr这类工具,可以用rowwise来逐行处理:
library(dplyr) list.paired <- list.paired %>% rowwise() %>% mutate( correlation = cor( longdat[[Var1]], longdat[[Var2]], use = "complete.obs" ) ) %>% ungroup()
关于你之前的eval(parse)问题
你之前的代码里加了.long后缀,如果你的longdat里的列名确实是measure1.long这种格式,那只需要在提取向量的时候加上后缀就行,比如:
x <- longdat[[paste0(list.paired$Var1[i], ".long")]] y <- longdat[[paste0(list.paired$Var2[i], ".long")]]
但还是不推荐用eval(parse),因为这种写法可读性差,而且容易因为字符串拼接出错,用[[提取列是R里更标准的做法。
内容的提问来源于stack exchange,提问作者pomodoro
相关产品推荐
相关产品推荐

