2017-01-29 1 views
1

J'ai une question à deux interlocuteurs . Dans la création d'un ensemble de données similaire à ce que j'ai, nous pouvons commencer par le jeu de données airquality:Rdiffusion: application de valeurs/exclusions conditionnelles aux sous-totaux

myaqm <- melt(airquality, id=c("Month", "Day"), na.rm = TRUE) 

myaqm_dcast <- dcast(myaqm, Day+variable~Month, 
     value.var = "value", sum, margins=c("Day", "variable", "Month")) 

nous donner ceci:

> head(myaqm_dcast, n=10) 
    Day variable  5  6  7  8  9 (all) 
1 1 Ozone 41.0 0.0 135.0 39.0 96.0 311.0 
2 1 Solar.R 190.0 286.0 269.0 83.0 167.0 995.0 
3 1  Wind 7.4 8.6 4.1 6.9 6.9 33.9 
4 1  Temp 67.0 78.0 84.0 81.0 91.0 401.0 
5 1 (all) 305.4 372.6 492.1 209.9 360.9 1740.9 
6 2 Ozone 36.0 0.0 49.0 9.0 78.0 172.0 
7 2 Solar.R 118.0 287.0 248.0 24.0 197.0 874.0 
8 2  Wind 8.0 9.7 9.2 13.8 5.1 45.8 
9 2  Temp 72.0 74.0 85.0 81.0 92.0 404.0 
10 2 (all) 234.0 370.7 391.2 127.8 372.1 1495.8 

Première question: Comment pouvez-vous retirer vent de chaque jour (tous) sous-total?

Je suis sûr que nous sommes censés utiliser dplyr, peut-être entièrement au lieu de dcast, mais pour la vie de moi, je ne peux pas trouver un exemple qui démontre des exclusions sous-total.

Deuxième question: De même, nous essayons aussi de travailler sur la façon d'inclure une quotidienne moyenne ligne de toutes les variables, à l'exception Temp. Ainsi, l'ensemble de données ressemblerait à quelque chose comme ceci:

Day variable  5  6  7  8  9 (all) 
1 1 Ozone 41.0 0.0 135.0 39.0 96.0 311.0 
2 1 Solar.R 190.0 286.0 269.0 83.0 167.0 995.0 
3 1  Wind 7.4 8.6 4.1 6.9 6.9 33.9 
4 1  Temp 67.0 78.0 84.0 81.0 91.0 401.0 
5 1 Day Avg 79.5 98.2 136.0 43.0 90.0 446.6 
6 1 (all) 298.0 364.0 488.0 203.0 354.0 1707.0 

7 2 Ozone 36.0 0.0 49.0 9.0 78.0 172.0 
8 2 Solar.R 118.0 287.0 248.0 24.0 197.0 874.0 
9 2  Wind 8.0 9.7 9.2 13.8 5.1 45.8 
10 2  Temp 72.0 74.0 85.0 81.0 92.0 404.0 
11 2 Day Avg 54.0 98.9 102.1 15.6 93.4 363.9 
12 2 (all) 226.0 361.0 382.0 114.0 367.0 1450.0 

Ici, Moy Day est la moyenne de l'ozone , Solar.R et Wind - ne comprend pas Temp.

Et (tous) est la somme de l'ozone , Solar.R et Temp - ne comprend pas Wind.

Je pense que c'est un autre cas pour dplyr, et ce serait une solution similaire, mais je pensais poser les deux questions. Edit: Il est important de mentionner que mes données du monde réel ont beaucoup plus de quatre variables chaque jour, dont certaines n'apparaissent pas chaque jour, mais doivent néanmoins être incluses dans le quotidien 'Day Moy'. et « (tous) » calculs, il serait donc plus propre à exclure les variables par nom (ie. Temp ou vent) plutôt que de nommer toutes les variables que le besoin d'être inclus (ie. ozone et solaire. R).

+0

Précision: Vous voulez vent apparaisse encore dans le résumé, mais pas faire partie du sous-total? –

+0

En effet. Le sous-total quotidien représente la somme de la contribution de tout, sans vent. summarize() peut toujours inclure Wind et Temp. –

Répondre

1

Le code ci-dessous calcule les deux résumés de colonne avec les données au format long et les ajoute ensuite à la longue trame de données, plutôt que de faire les calculs lors de la coulée, et ajoute ensuite les totaux de ligne à la fin:

library(reshape2) 
library(dplyr) 

myaqm <- melt(airquality, id=c("Month", "Day"), na.rm = TRUE) %>% 
      group_by(Month, Day) 

myaqm_summary = myaqm %>% 
    bind_rows(myaqm %>% 
       summarise(value = sum(value[variable != "Wind"], na.rm=TRUE), 
         variable = "All")) %>% 
    bind_rows(myaqm %>% 
       summarise(value = mean(value[variable != "Temp"]), 
         variable = "Day Avg")) %>% 
    dcast(Day + variable ~ Month, value.var = "value") %>% 
    mutate(All = rowSums(.[, grepl("[5-9]", names(.))], na.rm=TRUE)) 

Voici les 12 premières lignes de sortie:

Day variable   5  6  7   8   9  All 
1 1  All 298.00000 364.00 488.0000 203.00000 354.00000 1707.0000 
2 1 Day Avg 79.46667 147.30 136.0333 42.96667 89.96667 495.7333 
3 1 Ozone 41.00000  NA 135.0000 39.00000 96.00000 311.0000 
4 1 Solar.R 190.00000 286.00 269.0000 83.00000 167.00000 995.0000 
5 1  Temp 67.00000 78.00 84.0000 81.00000 91.00000 401.0000 
6 1  Wind 7.40000 8.60 4.1000 6.90000 6.90000 33.9000 
7 2  All 226.00000 361.00 382.0000 114.00000 367.00000 1450.0000 
8 2 Day Avg 54.00000 148.35 102.0667 15.60000 93.36667 413.3833 
9 2 Ozone 36.00000  NA 49.0000 9.00000 78.00000 172.0000 
10 2 Solar.R 118.00000 287.00 248.0000 24.00000 197.00000 874.0000 
11 2  Temp 72.00000 74.00 85.0000 81.00000 92.00000 404.0000 
12 2  Wind 8.00000 9.70 9.2000 13.80000 5.10000 45.8000