在没有For循环的情况下替换或输入R中的NA值
是否有更好的方法在数据框架中进行观察并估算NA值?我已经建立了一个“for循环”来完成这项工作,用行的平均值交换NAs,但我想知道是否有更好的方法不使用for循环来解决这个问题——也许是内置的R函数在没有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.
# 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"]]