使用余数的平均值来估算缺失值

时间:2014-09-10 15:51:24

标签: r

我有一个格式的数据框:

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初学者,我希望看到一个明确的,多步骤的过程。 (我认为这是一个学习练习,而不是一个特定的“解决这个问题”类型的问题。我对谁能用最少的角色做这件事并不感兴趣。)

3 个答案:

答案 0 :(得分:4)

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

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

答案 1 :(得分: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]

答案 2 :(得分: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