查找具有条件的NA,然后将值替换为取决于条件的值

时间:2013-09-20 18:47:37

标签: r

我无法弄明白......

我的数据框看起来像这样(只显示前10行):

Value   Type
NA       3      
23       2
54       1
45       1
21       2
55       3
67       3
78       1
10       1
NA       2

任务:

将NA替换为其给定类型的平均值。 例如:第一个NA在类型3中,所以我想用类型3中的平均值替换它,即(55 + 67)/ 2 = 61

我的代码:

for (i in 1:nrow(df)){
  if(is.na(df[i,"Value"])==TRUE & Type==1){
    df[i,"Value"] = mean(with(df, subset(Value, Type==1)))
  }
  else if (is.na(df[i,"Value"])==TRUE & Type==2){
    df[i,"Value"] = mean(with(df, subset(Value, Type==2)))
  }
  else if (is.na(df[i,"Value"])==TRUE & Type==3){
    df[i,"Value"] = mean(with(df, subset(Value, Type==3)))
  }
  else (df[i,"Value"] = df[i,"Value"])
}

结果

仍在“值”列中观察到NA,并且它们不会被其类的平均值替换。

任何帮助表示赞赏!

2 个答案:

答案 0 :(得分:2)

library(plyr) 

ddply(dat, .(Type), function(df){
  m <- mean(df$Value, na.rm=TRUE)
  df$Value[is.na(df$Value)] <- m
  df
})

答案 1 :(得分:0)

这是基数为R的双线,假设Xdata.frame

Means <- tapply(X$Value, X$Type, mean, na.rm=TRUE)
X$Value <- apply(X, 1, function(r) ifelse(is.na(r[1]), Means[r[2]], r[1]))

对于大型数据集,可能比使用ddply更快,但plyrdata.table包更通用,当然值得学习。