/ / données imputées avec médiane par date en R - r, plyr, données manquantes, médiane

données imputées avec médiane par date en R - r, plyr, données manquantes, médiane

Je dois remplacer les valeurs manquantes dans le champ "étapes" par la médiane des "étapes" calculées ce jour-là (groupe par "date"), les valeurs de NA étant supprimées. J'ai déjà référé cette fil mais mes valeurs NA ne sont pas remplacées. Quelqu'un peut-il m'aider à découvrir où je me trompe? Je préférerais utiliser un paquet de base / un tableau de données / un plyr. L'ensemble de données ressemble à peu près à ceci: -

        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 structure et le résumé de l'ensemble de données (activité) sont indiqués ci-dessous.

 #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

Choses que j'ai essayées:

Méthode 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

Utiliser 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

Tentative de 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

Agrégat pour le calcul de la médiane

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 sortie pour le code en utilisant mutate

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
..   ...        ...      ...

METTRE À JOUR:

Steven Beaupre m'a aidé à réaliser que mon approchecar l'imputation était erronée car il y avait des dates spécifiques ne contenant que des valeurs de NA qui posaient problème, la médiane de NA "s étant NA. Utiliser une autre approche suggérée.

Réponses:

4 pour la réponse № 1

Essayer:

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

Si pour une date donnée, toutes les étapes sont NAs, vous pouvez les remplacer par 0:

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