【发布时间】:2016-04-24 06:38:52
【问题描述】:
我试图用该列的中位数替换矩阵每一列中的 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)
}
【问题讨论】:
-
matrix对象是有维度的向量。lapply将循环遍历矩阵中的每个值而不是列。 -
如果您感觉超级懒惰并且不想编写自己的函数,您可以使用
randomForest库中的na.roughfix。它会根据是否为数字/因子自动将所有 NA 值替换为中值/众数。 -
@Jonno Bourne,如果您询问的是数据框而不是矩阵,请编辑您的可重现示例以提供数据框。请注意,这会使已接受的解决方案无效...
-
@smci 这个问题没有提到数据框,并且已经成功回答,一年半前使用矩阵,您能否澄清您的评论。
-
@JonnoBourne:我知道已经回答了,这就是我的意思,这个措辞含糊的问题是 being (wrongly) cited as a canonical answer elsewhere on SO 用于替换数据帧中的 NA。模糊的标题并没有明确说明它不适用于数据框,因此需要编辑标题。 (事实证明,“用列中位数替换数据帧中的 NA”没有规范的答案。因此,我们需要防止关于该主题的问题错误地被关闭为重复。好吗?
标签: r matrix na median imputation