R语言:如何在多数据框列表中计算X0与其余列的相关性
问题出在哪
两个层面的错误直接导致了报错和逻辑偏差:
- 数据结构完全不对:
replicate默认遇到同维度的重复输出会自动折叠成多维数组,根本不会生成你想要的“每个元素是独立数据框”的列表。你打印出来的dataframes是3维结构,所以用lapply遍历的时候拿到的不是二维数据框,自然报incorrect number of dimensions的错。 - 计算逻辑全是漏洞:
- 从数据框里提取单列之后本身就是数值向量,不需要再写
$V1二次索引 - 你要算X0和X2到X19的相关性,结果用
x[-c(1:1)]去掉第一列,把X1(第二列)也混进了计算范围 - 循环里最后写
return(x)返回的是原始数据框,等于算完了也没把结果存下来,白跑
- 从数据框里提取单列之后本身就是数值向量,不需要再写
正确的实现步骤
- 先重新生成符合结构要求的列表数据
给replicate加simplify = FALSE参数,强制输出独立元素组成的列表,关掉自动折叠成多维数组的默认行为:# 生成10组样本,每组是100行20列的标准正态分布数据 data_list <- replicate( n = 10, expr = as.data.frame(replicate(20, rnorm(100))), simplify = FALSE ) # 用str(data_list)验证:长度为10的列表,每个元素都是100行20列的data.frame,这才是你想要的结构 - 再修正循环内的计算逻辑
按照需求,每个数据框里取第一列当X0,取第3到20列当X2到X19,算完直接返回相关性结果就行:cor_results <- lapply(data_list, function(each_df) { # 提取X0:每个df的第一列 x0 <- each_df[, 1] # 提取要对比的样本:X2到X19,对应列索引3到20 target_samples <- each_df[, 3:20] # 计算相关性,直接返回 cor(x = x0, y = target_samples) }) - 可选优化:给计算结果加上对应样本名,省得对着索引找对应关系:
cor_results <- lapply(data_list, function(each_df) { x0 <- each_df[, 1] target_samples <- each_df[, 3:20] res <- cor(x = x0, y = target_samples) # 给结果加上样本名 setNames(res, nm = paste0("X", 2:19)) })
容易踩的坑
- 用
replicate想要得到列表结构的时候,一定要加simplify = FALSE,默认的自动折叠行为对固定维度的重复输出非常常见,很容易出现维度不匹配的低级报错 - 写
lapply循环的时候,function里的返回值一定要是你需要的计算结果,别为了测试方便把原始数据返回,做无用功
内容的提问来源于stack exchange,提问作者Pinus
相关产品推荐
相关产品推荐

