【问题标题】:Replacing or imputing NA values in R without For Loop在没有 For 循环的情况下替换或输入 R 中的 NA 值
【发布时间】:2015-11-05 15:34:23
【问题描述】:

是否有更好的方法来通过数据框中的观察并估算 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 

【问题讨论】:

  • 当您提供带有随机数生成的数据时,您应该始终使用set.seed
  • @akrun,很好的发现。看来那里的答案和我的一模一样。哦,好吧,我猜伟大的思想是一样的:)
  • @akrun imo,这个问题并不相同...... OP 没有接受另一个问题的答案。 ;) 我确实认为它可以帮助其他人通过查看处理和提出相关问题的不同方式来学习,尤其是在 R 中。我相信,这个问题的答案解释和结构具有一定的价值。
  • 好的,然后重新打开。

标签: r for-loop replace na


【解决方案1】:

一种可能性,使用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
}))

【讨论】:

    【解决方案2】:

    数据:

    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))
    

    【讨论】:

    • 因为rdatadf基本相同(一个是矩阵,另一个是数据框)
    【解决方案3】:

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

    indx <- which(is.na(df), arr.ind = TRUE)
    df[indx] <- rowMeans(df, na.rm = TRUE)[indx[,"row"]]
    

    一些解释

    我们可以使用which 中的arr.ind 参数来识别NAs 的位置。然后我们可以简单地索引df(通过行和列索引)和行均值(仅通过行索引)并相应地替换值

    【讨论】:

      猜你喜欢
      • 2012-06-27
      • 2021-07-12
      • 2019-02-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-11-02
      • 1970-01-01
      相关资源
      最近更新 更多