2014-09-10 2 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. Его час значение равно 0, поэтому я хочу усреднить другой Вес где Час равен 0 (эти значения составляют 4 и 3). Затем я хочу заменить NA на вычисленное среднее значение (3.5).

Как новичок R, я хотел бы видеть прозрачный многоступенчатый процесс для этого. (Я представляю это как упражнение для обучения, а не конкретный вопрос типа «решить эту проблему». Меня не интересует, кто может это сделать в наименьшем количестве символов.)

+0

0 Наверх – Roland

+0

@ Роланд: да, очень хорошо известно. Это чисто упражнение в обучении Р. – Eric

ответ

4

Для таких операций можно использовать ave.

dat$Weight <- 
ave(dat$Weight,dat$Hour,FUN=function(x){ 
    mm <- mean(x,na.rm=TRUE) 
    ifelse(is.na(x),mm,x) 
}) 
  • Вы примените функцию группы часов.
  • Для каждой группы вы вычисляете средние значения пропущенных значений.
  • Вы назначаете среднее значение, если значение является отсутствующим значением, иначе вы сохраните значение начала.
  • Вы заменяете вектор Вес новым созданным вектором.
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