在没有For循环的情况下替换或输入R中的NA值

在没有For循环的情况下替换或输入R中的NA值,r,for-loop,replace,na,R,For Loop,Replace,Na,是否有更好的方法在数据框架中进行观察并估算NA值?我已经建立了一个“for循环”来完成这项工作,用行的平均值交换NAs,但我想知道是否有更好的方法不使用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.

是否有更好的方法在数据框架中进行观察并估算NA值?我已经建立了一个“for循环”来完成这项工作,用行的平均值交换NAs,但我想知道是否有更好的方法不使用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 
#1。使用一些NA值创建数据帧。

rdata一种可能性,使用
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
}))
t(应用(df2,1,函数(x){

mu一种可能性,使用Hmisc中的
插补
,允许选择任何函数进行插补

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
}))
t(应用(df2,1,函数(x){
mu数据:

数据:


这是一种可能的矢量化方法(没有任何循环)


indx这里有一种可能的矢量化方法(没有任何循环)


indx当您使用随机数提供数据时,应始终使用
set.seed
generation@akrun,很好的发现。那里的答案似乎与我的答案完全相同。哦,好吧,我想,伟人的想法是一样的:)@akrun imo,这个问题并不完全相同……OP没有接受另一个问题的答案。;)我确实认为,通过观察不同的接近和询问相关问题的方式,这有助于其他人学习,特别是在R中。我认为,这个问题的答案解释和结构有一定的价值。好的,然后它被重新打开。当你提供随机数数据时,你应该始终使用
set.seed
generation@akrun很好,找到了似乎那里的答案和我的完全一样。哦,好吧,我想,伟人的想法是一样的:)@akrun imo,这个问题并不完全相同……OP没有接受另一个问题的答案;)我确实认为,通过观察不同的接近和询问相关问题的方式,这有助于其他人学习,特别是在R中。我认为,这个问题的答案解释和结构有一定的价值。好的,然后重新打开。因为
rdata
df
基本相同(一个是矩阵,另一个是数据帧)因为
rdata
df
基本相同(一个是矩阵,另一个是数据帧)
indx <- which(is.na(df), arr.ind = TRUE)
df[indx] <- rowMeans(df, na.rm = TRUE)[indx[,"row"]]