填充矩阵的R代码全为NA值,如何将y的计算值存入steal矩阵?
解决你的R矩阵赋值全NA问题
我看了你的代码,问题主要出在数据类型、向量长度匹配以及循环内的元素索引逻辑上,导致计算出来的y值无法正确存入steal矩阵,最终全是NA。下面一步步给你拆解和修正:
首先,原代码的核心问题
- 不必要的list包装:你把
p1、p2、pBASP都用list()包起来了,但我们需要的是数值向量,直接用runif()生成的向量就可以,list会导致后续除法运算无法按单个元素执行。 - 向量长度不匹配:你的矩阵是10行×100列=1000个元素,但
p1只有250个、p2是500个,和矩阵元素总数不匹配,循环里的运算会触发R的循环补齐,完全不是你想要的对应位置计算。 - 循环内的索引错误:你直接用
p1/p2是对整个向量做运算,而不是取当前(i,j)位置对应的单个元素,导致y[i,j]无法得到有效数值,自然steal全是NA。 - 依赖全局变量:函数里直接用全局的
row和col,这不是好的编程习惯,容易引发意外错误。
修正后的完整代码
方式1:修正循环版本(保留你的逻辑)
set.seed(1234) row_n <- 10 # 改名避免和base包的row函数冲突 col_n <- 100 # 生成和矩阵总元素数一致的向量(10*100=1000个) p1 <- runif(1000, 0, 0.250) p2 <- runif(1000, 0.250, 0.750) pBASP <- runif(1000, 0, 1) # 初始化结果矩阵 steal <- matrix(data=NA, nrow=row_n, ncol=col_n) success <- function(p1, p2, pBASP, row_n, col_n) { # 在函数内初始化y矩阵,避免依赖全局变量 y <- matrix(data=NA, nrow=row_n, ncol=col_n) for(i in 1:row_n) { for(j in 1:col_n) { # 计算当前矩阵位置对应的向量索引(R矩阵按列存储,索引公式为(i-1)*col_n + j) idx <- (i - 1)*col_n + j # 计算单个位置的y值 y[i,j] <- (p1[idx]/p2[idx]) + pBASP[idx] # 判断是否存入steal if(y[i,j] > 0.750){ steal[i,j] <- y[i,j] } } } return(steal) } # 调用函数得到结果 result_steal <- success(p1, p2, pBASP, row_n, col_n) # 查看前5行前5列的结果 head(result_steal[, 1:5])
方式2:向量化运算(更高效,R推荐写法)
R的循环效率较低,对于这种元素级的运算,用向量化操作会快很多,代码也更简洁:
set.seed(1234) row_n <- 10 col_n <- 100 p1 <- runif(1000, 0, 0.250) p2 <- runif(1000, 0.250, 0.750) pBASP <- runif(1000, 0, 1) # 先计算所有y值的向量 y_vec <- (p1/p2) + pBASP # 转换成矩阵 y_mat <- matrix(y_vec, nrow=row_n, ncol=col_n) # 直接生成steal矩阵:满足条件的保留值,否则为NA steal_mat <- matrix(ifelse(y_vec > 0.750, y_vec, NA), nrow=row_n, ncol=col_n) # 查看结果 head(steal_mat[, 1:5])
验证结果
运行上面的代码后,steal矩阵里会有符合条件的数值,不再全是NA。你可以用sum(!is.na(steal_mat))查看有多少个非NA值,验证计算是否正常。
内容的提问来源于stack exchange,提问作者Brian Dudkowski
相关产品推荐
相关产品推荐

