R语言:遍历部分填充相关矩阵,筛选高方差变量的循环问题
帮你修复R语言循环填充向量的问题
我看了你的代码,发现几个导致它无法正常运行的关键问题,咱们一步步来解决:
- 循环范围写错了:
for (i in ncol(mcor))只会让i取到矩阵的列数这一个数值,根本不会遍历每一列!正确的写法应该是for (i in 1:ncol(mcor)),同理j的循环也要改成1:nrow(mcor),这样才能遍历矩阵的每个元素。 - 手动改循环变量没用:你在遇到NA时写
j = j+1,但for循环里的j是每次迭代自动赋值的,手动改了也不会影响下一次循环的取值。想要跳过NA的话,用next语句就可以直接进入下一次循环。 - 名字踩了内置函数的坑:
var是R自带的方差计算函数,你把它用作数据框名很容易引发混淆,建议改成var_df这种不会冲突的名字。 - 动态拼接向量效率低:每次用
vec <- c(vec, ...)扩展向量会反复申请内存,数据量大的时候会很慢,最好预先分配好向量的空间。
修正后的完整代码
# 先把你的方差数据框改名,避免和内置函数冲突 var_df <- var # 这里假设原来的var是你的方差数据框 # 预先分配向量空间,大小等于矩阵的元素总数 vec <- vector("numeric", length = ncol(mcor) * nrow(mcor)) k <- 1 # 用来记录当前要填充的vec位置 for (i in 1:ncol(mcor)) { for (j in 1:nrow(mcor)) { if (is.na(mcor[i,j])) { next # 跳过NA的位置,直接进入下一次循环 } else { # 比较两个位置的方差,把大的那个存进vec if (var_df[j,2] > var_df[i,2]) { vec[k] <- var_df[j,2] } else { vec[k] <- var_df[i,2] } k <- k + 1 # 移动到下一个要填充的位置 } } } # 如果有跳过的NA位置,最后去掉vec里未填充的空值 vec <- vec[1:(k-1)]
更高效的向量化写法(推荐)
R里嵌套循环的效率不算高,如果你的矩阵维度比较大,试试这种向量化的写法,速度会快很多:
# 先找出矩阵里所有非NA元素的行列索引 non_na_pos <- which(!is.na(mcor), arr.ind = TRUE) # 提取对应位置的方差值 var_col <- var_df[non_na_pos[, "col"], 2] var_row <- var_df[non_na_pos[, "row"], 2] # 直接对每一组方差取最大值,得到结果向量 vec <- pmax(var_col, var_row)
内容的提问来源于stack exchange,提问作者Daniel
相关产品推荐
相关产品推荐

