2015-05-16 25 views
7

Ho bisogno di sostituire i valori mancanti nel campo "passi" dalla mediana di "passi" calcolati in quel particolare giorno (gruppo per "data") con valori NA rimossi. Ho già segnalato questo thread ma i miei valori NA non vengono sostituiti. Qualcuno può aiutarmi a scoprire dove sto sbagliando? Preferirei usare il pacchetto base/tabella dati/plyr. Il set di dati sembra ca. in questo modo: -dati di imputazione con data mediana per R

 steps  date interval 
    1: NA 2012-10-01  0 
    2: NA 2012-10-01  5 
    3: NA 2012-10-01  10 
    4: NA 2012-10-01  15 
    5: NA 2012-10-01  20 
    ---       
17564: NA 2012-11-30  2335 
17565: NA 2012-11-30  2340 
17566: NA 2012-11-30  2345 
17567: NA 2012-11-30  2350 
17568: NA 2012-11-30  2355 

La struttura e la sintesi del set di dati (attività) sono riportati di seguito

#str(activity) 
Classes ‘data.table’ and 'data.frame': 17568 obs. of 3 variables: 
    $ steps : int NA NA NA NA NA NA NA NA NA NA ... 
    $ date : Date, format: "2012-10-01" "2012-10-01" "2012-10-01" ... 
    $ interval: int 0 5 10 15 20 25 30 35 40 45 ... 

#summary(activity) 
     steps    date    interval  
    Min. : 0.00 Min. :2012-10-01 Min. : 0.0 
    1st Qu.: 0.00 1st Qu.:2012-10-16 1st Qu.: 588.8 
    Median : 0.00 Median :2012-10-31 Median :1177.5 
    Mean : 37.38 Mean :2012-10-31 Mean :1177.5 
    3rd Qu.: 12.00 3rd Qu.:2012-11-15 3rd Qu.:1766.2 
    Max. :806.00 Max. :2012-11-30 Max. :2355.0 
    NA's :2304  

Le cose che ho provato:

metodo Datatable:

activityrepNA<-activity[,steps := ifelse(is.na(steps), median(steps, na.rm=TRUE), steps), by=date] 
summary(activityrepNA) 
    steps    date    interval  
Min. : 0.00 Min. :2012-10-01 Min. : 0.0 
1st Qu.: 0.00 1st Qu.:2012-10-16 1st Qu.: 588.8 
Median : 0.00 Median :2012-10-31 Median :1177.5 
Mean : 37.38 Mean :2012-10-31 Mean :1177.5 
3rd Qu.: 12.00 3rd Qu.:2012-11-15 3rd Qu.:1766.2 
Max. :806.00 Max. :2012-11-30 Max. :2355.0 
NA's :2304 

Utilizzo di ave

activity$steps[is.na(activity$steps)] <- with(activity, ave(steps,date, FUN = function(x) median(x, na.rm = TRUE)))[is.na(activity$steps)] 
> summary(activity) 
    steps    date    interval  
Min. : 0.00 Min. :2012-10-01 Min. : 0.0 
1st Qu.: 0.00 1st Qu.:2012-10-16 1st Qu.: 588.8 
Median : 0.00 Median :2012-10-31 Median :1177.5 
Mean : 37.38 Mean :2012-10-31 Mean :1177.5 
3rd Qu.: 12.00 3rd Qu.:2012-11-15 3rd Qu.:1766.2 
Max. :806.00 Max. :2012-11-30 Max. :2355.0 
NA's :2304 

Tentativo di ddply

cleandatapls<-ddply(activity, 
+  .(as.character(date)), 
+  transform, 
+  steps=ifelse(is.na(steps), median(steps, na.rm=TRUE), steps)) 
> summary(cleandatapls) 
as.character(date)  steps    date    interval  
Length:17568  Min. : 0.00 Min. :2012-10-01 Min. : 0.0 
Class :character 1st Qu.: 0.00 1st Qu.:2012-10-16 1st Qu.: 588.8 
Mode :character Median : 0.00 Median :2012-10-31 Median :1177.5 
        Mean : 37.38 Mean :2012-10-31 Mean :1177.5 
        3rd Qu.: 12.00 3rd Qu.:2012-11-15 3rd Qu.:1766.2 
        Max. :806.00 Max. :2012-11-30 Max. :2355.0 
        NA's :2304 

aggregata per il calcolo mediana uscita

whynoclean<-aggregate(activity,by=list(activity$date),FUN=median,na.rm=TRUE) 
> summary(whynoclean) 
    Group.1    steps  date    interval 
Min. :2012-10-01 Min. :0 Min. :2012-10-01 Min. :1178 
1st Qu.:2012-10-16 1st Qu.:0 1st Qu.:2012-10-16 1st Qu.:1178 
Median :2012-10-31 Median :0 Median :2012-10-31 Median :1178 
Mean :2012-10-31 Mean :0 Mean :2012-10-31 Mean :1178 
3rd Qu.:2012-11-15 3rd Qu.:0 3rd Qu.:2012-11-15 3rd Qu.:1178 
Max. :2012-11-30 Max. :0 Max. :2012-11-30 Max. :1178 
         NA's :8      

EDIT per il codice utilizzando mutare

activity %>% group_by(date) %>% mutate(steps = replace(steps, is.na(steps), median(steps, na.rm = T))) 
Source: local data table [17,568 x 3] 

    steps  date interval 
1  NA 2012-10-01  0 
2  NA 2012-10-01  5 
3  NA 2012-10-01  10 
4  NA 2012-10-01  15 
5  NA 2012-10-01  20 
6  NA 2012-10-01  25 
7  NA 2012-10-01  30 
8  NA 2012-10-01  35 
9  NA 2012-10-01  40 
10 NA 2012-10-01  45 
.. ...  ...  ... 

UPDATE:

Steven Beaupre aiutato mi rendo conto che il mio approccio per l'imputazione era viziato perché c'erano date specifiche che avevano solo valori di NA che stavano causando il problema in quanto la mediana di NA è NA. Usato un altro approccio suggerito.

risposta

4

Prova:

library(dplyr) 
df %>% 
    group_by(date) %>% 
    mutate(steps = ifelse(is.na(steps), median(steps, na.rm = T), steps)) 

Se per una certa data, tutti i passaggi sono NA s, è possibile sostituirli con 0:

df %>% 
    group_by(date) %>% 
    mutate(steps = ifelse(all(is.na(steps)), 0, 
         ifelse(is.na(steps), median(steps, na.rm = T), steps))) 
+0

Grazie! Devo caricare una libreria? Sta dicendo che non è stato possibile trovare la funzione%>% – Meeshu

+0

Prova 'install.packages (" dplyr "); libreria (dplyr) ' –

+0

Ciao, grazie ancora ma ho bisogno di sostituirlo con la mediana dei passaggi (calcolata dopo aver rimosso i valori di NA) e non la mediana dell'intervallo. Ho provato il codice sostituendo l'intervallo con i passaggi e il NA rimane ancora. Modifica della domanda per specificarlo – Meeshu