【问题标题】:replacing a missing value in R with average value用平均值替换 R 中的缺失值
【发布时间】:2015-06-26 18:48:43
【问题描述】:

我有一个数据框,其中包含缺失值的数据列,我想通过使用上方和下方单元格的值取平均值来替换缺失值。

 df1<-c(2,2,NA,10, 20, NA,3)
 if(df1[i]== NA){
 df1[i]= mean(df1[i+1],df1[i-1])
}

但是,我收到了这个错误

  Error in if (df1[i] == NA) { : missing value where TRUE/FALSE needed
  In addition: Warning message:
  In if (df1[i] == NA) { :
  the condition has length > 1 and only the first element will be used

如果能提供解决此问题的任何指导,我们将不胜感激。

【问题讨论】:

  • 如果连续有两个 NA 值怎么办?如果缺少第一个或最后一个元素怎么办?
  • 我以 df1 为例,但我的数据集包含数千个值,并且发现 NA 不是连续的。

标签: r if-statement average missing-data


【解决方案1】:

如果你确定你没有任何连续的 NA 值并且第一个和最后一个元素永远不是 NA,那么你可以这样做

df1<-c(2,2,NA,10, 20, NA,3)
idx<-which(is.na(df1))
df1[idx] <- (df1[idx-1] + df1[idx+1])/2
df1
# [1]  2.0  2.0  6.0 10.0 20.0 11.5  3.0

这应该比循环更有效。

【讨论】:

    【解决方案2】:

    使用来自dplyr 的滞后和超前:

    library(dplyr)
    
    df1[is.na(df1)] <- (df1[is.na(lag(df1, default=""))] +          
                        df1[is.na(lead(df1, default=""))]) / 2
    

    这将比 for 循环版本快得多

    【讨论】:

      【解决方案3】:

      您可以使用 zoo 包中的 na.approx() 将 NA 替换为插值:

      library(zoo)
      > na.approx(df1)
      # [1]  2.0  2.0  6.0 10.0 20.0 11.5  3.0
      

      根据@G.Grothendieck 所述,如果连续有多个NAs,这将填充NAs。此外,如果末尾可以有NAs,则添加参数na.rm = FALSE 将保留它们,或者添加rule = 2 将用第一个或最后一个非NA 替换它们。

      【讨论】:

      • 应该指出,如果一行中有多个 NA,则此解决方案是唯一填充 NA 的解决方案。此外,如果末尾可能有 NA,则添加参数 na.rm=FALSE 将保留它们,或者添加 rule=2 将用第一个或最后一个非 NA 替换它们。
      【解决方案4】:

      使用is.na()检查NA,创建一个循环并给mean()一个向量作为参数,否则它只会看到第一个值。如果您没有连续的 NA 并且第一个和最后一个条目不是 NA,这应该可以工作:

      df1<-c(2,2,NA,10, 20, NA,3)
      for(i in 2:(length(df1)-1)){
        if(is.na(df1[i])){
           df1[i]= mean(c(df1[i+1],df1[i-1]))
        }
      }
      

      【讨论】:

        【解决方案5】:

        它首先检查相应列中的 NA,如果有缺失值,则用列的平均值替换,否则只返回数据集。

        df$col_name

        【讨论】:

          猜你喜欢
          • 2018-02-05
          • 2012-05-03
          • 2018-12-27
          • 1970-01-01
          • 2017-02-24
          • 1970-01-01
          • 1970-01-01
          • 2013-09-07
          相关资源
          最近更新 更多