2014-09-10 83 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