用平均值替换R中的缺失值

时间:2015-06-26 18:48:44

标签: r if-statement average missing-data

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

Y - X = Target

但是,我收到此错误

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

任何指导都将不胜感激以解决此问题。

5 个答案:

答案 0 :(得分:3)

如果您确定没有任何连续的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

这应该比循环更有效。

答案 1 :(得分:2)

使用dplyr中的滞后和潜在客户:

library(dplyr)

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

这比for循环版

要快得多

答案 2 :(得分:2)

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

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

正如@ G.Grothendieck所提到的,如果连续多个NA,这将填充NA s。此外,如果末尾可以有NA个,那么添加参数na.rm = FALSE将保留它们,或者添加rule = 2将使用第一个或最后一个非NA替换它们。 / p>

答案 3 :(得分:1)

检查NAs使用is.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]))
  }
}

答案 4 :(得分:0)

首先检查相应列中的NA,如果缺少值,将其替换为列的平均值,否则仅返回数据集。

df $ col_name <-ifelse(is.na(df $ col_name),ave(df $ col_name,                             Fun = function(x)mean(x,na.rm == TRUE)),df $ col_name)