R dcast:将值/条件排除应用于小计

时间:2017-01-29 23:31:47

标签: r dplyr subtotal dcast

我有一个两个问题。在创建类似于我的数据集时,我们可以从 airquality 数据集开始:

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 ?< / p>

我确信我们打算使用dplyr,或许完全取代dcast,但是对于我的生活,我找不到一个展示次级排除的例子。< / p>

第二个问题:同样,我们也试图找出如何包含所有变量的每日平均行,排除 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

此处, Day Avg Ozone Solar.R Wind 的平均值 - 不包括 Temp

(全部) Ozone Solar.R Temp 的总和 - 不包括 Wind

我认为这是dplyr的另一种情况,这将是一个类似的解决方案,但我想我会问两个问题。

编辑:值得一提的是,我的真实世界数据每天都有超过四个变量,其中一些实际上并不是每天出现,但仍然需要包含在每日“平均日”和'(全部)'计算,因此按名称排除变量(即 Temp Wind )而不是命名所有需要包含的变量会更加清晰(即。臭氧 Solar.R )。

1 个答案:

答案 0 :(得分: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