2014-10-13 9 views
6

Sto imparando il pacchetto dplyr in R e mi piace molto. Ma ora ho a che fare con i valori di NA nei miei dati.R: sostituzione dei valori NA per mezzo di ora con dplyr

Vorrei sostituire qualsiasi NA per la media del corrispondente ora, ad esempio, con questo molto facile esempio:

#create an example 
day = c(1, 1, 2, 2, 3, 3) 
hour = c(8, 16, 8, 16, 8, 16) 
profit = c(100, 200, 50, 60, NA, NA) 
shop.data = data.frame(day, hour, profit) 

#calculate the average for each hour 
library(dplyr) 
mean.profit <- shop.data %>% 
    group_by(hour) %>% 
    summarize(mean=mean(profit, na.rm=TRUE)) 

> mean.profit 
Source: local data frame [2 x 2] 

    hour mean 
1 8 75 
2 16 130 

Posso usare il dplyr comando di trasformazione per sostituire la NA del del giorno 3 nel profitto con 75 (per 8:00) e 130 (per 16:00)?

risposta

15

Provate

shop.data %>% 
      group_by(hour) %>% 
      mutate(profit= ifelse(is.na(profit), mean(profit, na.rm=TRUE), profit)) 

    # day hour profit 
    #1 1 8 100 
    #2 1 16 200 
    #3 2 8  50 
    #4 2 16  60 
    #5 3 8  75 
    #6 3 16 130 

Oppure si potrebbe usare replace

shop.data %>% 
      group_by(hour) %>% 
      mutate(profit= replace(profit, is.na(profit), mean(profit, na.rm=TRUE))) 
+1

Sono venuto qui perché non ho notato io ho dimenticato la chiave: 'na.rm = TRUE' – jbkunst

3

Un approccio (meno elegante) con funzioni base:

transform(shop.data, 
      profit = ifelse(is.na(profit), 
          ave(profit, hour, FUN = function(x) mean(x, na.rm = TRUE)), 
          profit)) 

# day hour profit 
# 1 1 8 100 
# 2 1 16 200 
# 3 2 8  50 
# 4 2 16  60 
# 5 3 8  75 
# 6 3 16 130 
Problemi correlati