2017-01-29 2 views
1

У меня есть двухпарный вопрос. При создании набора данных, похожий на то, что у меня есть, мы можем начать с Качество воздуха набора данных:R dcast: применение значения/условных исключений к подсчетам

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")) 

Давать нам это:

> 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 

Первый вопрос: Как вы можете удалить Wind от каждой ежедневной (все) под-итого?

Я уверен, что мы должны использовать dplyr, возможно, целиком вместо dcast, однако для жизни меня не удается найти пример, демонстрирующий неполные исключения.

Второй вопрос: Точно так же мы и пытаемся выяснить, как включить ежедневный средний ряд всех переменных, за исключением Temp. Таким образом, набор данных будет выглядеть примерно так:

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 

Здесь день Среднее это среднее Озон, Solar.R и Wind - не включает в себя Temp.

И (все) является суммой Озон, Solar.R и Temp - не включает Wind.

Я думаю, что это еще один случай для dplyr, и это было бы аналогичным решением, но я думал, что задаю оба вопроса.

Редактировать: Следует упомянуть, что мои данные в реальном мире имеют гораздо больше четырех переменных каждый день, некоторые из которых на самом деле не появляются каждый день, но тем не менее должны быть включены в ежедневную «Дневную Avg», и «(все)» расчеты, так что было бы чище, чтобы исключить переменные по имени (то есть. Temp или Wind), а не имен всех переменных, чем должны быть включены (например. Озон и Solar. R).

+0

Разъяснение: Вы хотите Ветер по-прежнему появляются в резюме, но не быть частью итога? –

+0

Действительно. Ежедневный промежуточный итог представляет собой сумму вклада всего, без ветров. summary() может по-прежнему включать Wind и Temp. –

ответ

1

Приведенный ниже код вычисляет две сводки столбца с данными в длинном формате, а затем добавляет их к длинному кадра данных, а не делать расчеты в процессе литья, а затем добавляет строки итогов в конце:

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

Вот первые 12 строк вывода:

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 
Смежные вопросы