用该列的中位数替换矩阵每一列中的 NA

标签 r matrix na median imputation

我试图用该列的中位数替换矩阵每一列中的 NA,但是当我尝试使用 lapply 时或 sapply我收到一个错误;当我使用 for 循环并且一次更改一列时,代码有效,我做错了什么?

例子:

set.seed(1928)
mat <- matrix(rnorm(100*110), ncol = 110)
mat[sample(1:length(mat), 700, replace = FALSE)] <- NA
mat1 <- mat2 <- mat

mat1 <- lapply(mat1,
  function(n) {
     mat1[is.na(mat1[,n]),n] <- median(mat1[,n], na.rm = TRUE)
  }
)   

for (n in 1:ncol(mat2)) {
  mat2[is.na(mat2[,n]),n] <- median(mat2[,n], na.rm = TRUE)
}

最佳答案

我建议使用 matrixStats 对其进行矢量化包而不是使用任何一个循环计算每列的中位数(sapply 也是一个循环,它在每次迭代中评估一个函数)。

首先,我们将创建一个 NA指数

indx <- which(is.na(mat), arr.ind = TRUE)

然后,替换 NA s 使用预先计算的列中位数并根据索引
mat[indx] <- matrixStats::colMedians(mat, na.rm = TRUE)[indx[, 2]]

关于用该列的中位数替换矩阵每一列中的 NA,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34865789/

相关文章:

r - 使用 R 通过循环将数据读取和写入文件的有效方法

R Shiny 使用 iframe 本地文件

r - 将 NULL 对象转换为数据框中的可用对象

matrix - 快速可视化一个大的二进制矩阵?

r - 如何合并 R 中的两列?

json - rjsonlite 中的 toJSON(fromJSON ('1.json' )) 不会生成相同的 JSON

java - 如何每行显示矩阵值

algorithm - 分区矩阵以最小化部件的方差

r - 在 R 中通过 ID 进行最后的观察

r - 在 R 中将字符串转换为日期会返回 NA