用 R 中的列中位数进行插补
Imputation with column medians in R
如果我有一个向量,例如
vec <- c(3,4,5,NA)
我可以使用以下代码将 NA 替换为向量中其他值的中值:
vec[which(is.na(vec))] <- median(vec, na.rm = T)
但是,如果我有一个包含 NA 的矩阵,在矩阵的所有列上应用相同的代码不会返回一个矩阵,只会返回每个矩阵列的中位数。
mat <- matrix(c(1,NA,3,5,6,7,NA,3,4,NA,2,8), ncol = 3)
apply(mat, 2, function(x) x[which(is.na(x))] <- median(x, na.rm=T) )
#[1] 3 6 4
如何用列中位数替换 NA 来恢复矩阵?这个问题类似:Replace NA values by row means 但我无法根据我的情况调整任何解决方案。
在 apply 函数的最后一行添加 return(x)
即可解决。
> apply(mat, 2, function(x){
x[which(is.na(x))] <- median(x, na.rm=T)
return(x)
})
[,1] [,2] [,3]
[1,] 1 6 4
[2,] 3 7 4
[3,] 3 6 2
[4,] 5 3 8
zoo
中有一个方便的函数(na.aggregate
)可以用指定的FUN
替换NA元素。
library(zoo)
apply(mat, 2, FUN = function(x) na.aggregate(x, FUN = median))
# [,1] [,2] [,3]
#[1,] 1 6 4
#[2,] 3 7 4
#[3,] 3 6 2
#[4,] 5 3 8
或者如@G.Grothendieck所说,na.aggregate
可以直接应用在matrix
na.aggregate(mat, FUN = median)
如果我有一个向量,例如
vec <- c(3,4,5,NA)
我可以使用以下代码将 NA 替换为向量中其他值的中值:
vec[which(is.na(vec))] <- median(vec, na.rm = T)
但是,如果我有一个包含 NA 的矩阵,在矩阵的所有列上应用相同的代码不会返回一个矩阵,只会返回每个矩阵列的中位数。
mat <- matrix(c(1,NA,3,5,6,7,NA,3,4,NA,2,8), ncol = 3)
apply(mat, 2, function(x) x[which(is.na(x))] <- median(x, na.rm=T) )
#[1] 3 6 4
如何用列中位数替换 NA 来恢复矩阵?这个问题类似:Replace NA values by row means 但我无法根据我的情况调整任何解决方案。
在 apply 函数的最后一行添加 return(x)
即可解决。
> apply(mat, 2, function(x){
x[which(is.na(x))] <- median(x, na.rm=T)
return(x)
})
[,1] [,2] [,3]
[1,] 1 6 4
[2,] 3 7 4
[3,] 3 6 2
[4,] 5 3 8
zoo
中有一个方便的函数(na.aggregate
)可以用指定的FUN
替换NA元素。
library(zoo)
apply(mat, 2, FUN = function(x) na.aggregate(x, FUN = median))
# [,1] [,2] [,3]
#[1,] 1 6 4
#[2,] 3 7 4
#[3,] 3 6 2
#[4,] 5 3 8
或者如@G.Grothendieck所说,na.aggregate
可以直接应用在matrix
na.aggregate(mat, FUN = median)