2014-09-10 82 views
1

我有以下形式的数据帧的缺失值:插补与平均剩余

Weight Day  Hour 
NA  M  0 
NA  M  1 
2  M  2 
1  M  3 
4  T  0 
5  T  1 
NA  T  2 
2  T  3 
3  W  0 
3  W  1 
1  W  2 
NA  W  3 

对于重量给定的NA值,我想和平均非来代替它具有相同数值的NA值为小时。例如,重量中的第一个值是NA。它的小时值是0,所以我想平均其他重量其中小时是0(这些值是4和3)。然后我想用计算的平均值(3.5)替换NA。

作为的R初学者,我想看到这个明确的,多步骤的过程。 (我把这作为一个学习练习,而不是一个特定的“解决这个问题”类型的问题,我不感兴趣谁能用最少的字符做这件事。)

+0

我希望你知道在大多数情况下比平均插补有更好的方法。 – Roland 2014-09-10 16:21:57

+0

@罗兰:是的,非常清楚。这纯粹是学习R的练习。 – Eric 2014-09-10 16:24:32

回答

4

您可以使用ave进行此类操作。

dat$Weight <- 
ave(dat$Weight,dat$Hour,FUN=function(x){ 
    mm <- mean(x,na.rm=TRUE) 
    ifelse(is.na(x),mm,x) 
}) 
  • 您将通过数小时组应用功能。
  • 对于每个组,您计算平均wuthout缺失值。
  • 如果值为缺失值,则指定均值,否则保留原始值。
  • 用新创建的矢量替换权重矢量。
4

你也可以使用data.table

library(data.table) 
setDT(dat)[, list(Weight=replace(Weight, is.na(Weight), 
     mean(Weight, na.rm=TRUE))),by=Hour] 

或者

setDT(dat)[, Weight1:=mean(Weight, na.rm=TRUE), by=Hour][, 
       Weight:=ifelse(is.na(Weight), Weight1, Weight)][, Weight1:=NULL] 
4

这里有一个dplyr解决方案。它既快速又容易理解(因为它是管道结构),因此对初学者来说可能是一个好的开始。假设df是你的数据集

library(dplyr) 
df %>% # Select your data set 
    group_by(Hour) %>% # Group by Hour 
    mutate(Weight = ifelse(is.na(Weight), 
         mean(Weight, na.rm = TRUE), 
         Weight)) # Replace all NAs with the mean