[英]Replacing or imputing NA values in R without For Loop
有没有更好的方法来检查数据帧中的观测值并估算NA值? 我已经拼凑了一个似乎可以完成工作的“ for循环”,将NA与该行的平均值交换,但是我想知道是否有更好的方法不使用for循环来解决此问题-也许内置的R函数?
# 1. Create data frame with some NA values.
rdata <- rbinom(30,5,prob=0.5)
rdata[rdata == 0] <- NA
mtx <- matrix(rdata, 3, 10)
df <- as.data.frame(mtx)
df2 <- df
# 2. Run for loop to replace NAs with that row's mean.
for(i in 1:3){ # for every row
x <- as.numeric(df[i,]) # subset/extract that row into a numeric vector
y <- is.na(x) # create logical vector of NAs
z <- !is.na(x) # create logical vector of non-NAs
result <- mean(x[z]) # get the mean value of the row
df2[i,y] <- result # replace NAs in that row
}
# 3. Show output with imputed row mean values.
print(df) # before
print(df2) # after
这是一种可能的矢量化方法(无任何循环)
indx <- which(is.na(df), arr.ind = TRUE)
df[indx] <- rowMeans(df, na.rm = TRUE)[indx[,"row"]]
一些解释
我们可以识别的位置NA
使用S arr.ind
参数which
。 然后我们可以简单地索引df
(通过行和列索引)和行均值(仅通过行索引)并相应地替换值
一种可能性是使用Hmisc
impute
,它允许选择任何函数进行插补,
library(Hmisc)
t(sapply(split(df2, row(df2)), impute, fun=mean))
另外,您可以在apply
隐藏循环
t(apply(df2, 1, function(x) {
mu <- mean(x, na.rm=T)
x[is.na(x)] <- mu
x
}))
数据:
set.seed(102)
rdata <- matrix(rbinom(30,5,prob=0.5),nrow=3)
rdata[cbind(1:3,2:4)] <- NA
df <- as.data.frame(rdata)
这比我想要的要复杂一些-它依赖于R中矩阵的列主要排序以及行均值向量到矩阵全长的循环。 我试图提出一个sweep()
解决方案,但到目前为止还没有解决。
rmeans <- rowMeans(df,na.rm=TRUE)
df[] <- ifelse(is.na(df),rmeans,as.matrix(df))
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.