R dcast:将 value/conditional 排除项应用于小计
R dcast: applying value/conditional exclusions to sub-totals
我有一个双人问题。在创建类似于我所拥有的数据集时,我们可以从 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 ](全部)小计?
我确定我们打算使用 dplyr
,也许完全而不是 dcast
,但是对于我来说,我找不到一个例子来证明小计排除.
第二个问题:类似地,我们也在尝试计算如何包含所有变量的每日平均值行,不包括 温度。所以数据集看起来像这样:
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。
而(全部)是臭氧的总和,Solar.R Temp -- 不包括 Wind。
我认为这是 dplyr
的另一种情况,这将是一个类似的解决方案,但我想我会问这两个问题。
编辑:值得一提的是,我的真实世界数据每个都有四个以上的变量'day',其中一些实际上并不是每天都出现,但仍然需要包含在每日'Day Avg' 和 '(all)' 计算,因此按名称排除变量会更清晰(即 Temp 或 Wind)而不是命名所有需要包含的变量(即 Ozone 和 Solar.R)。
下面的代码使用长格式数据计算两列汇总,然后将它们添加到长数据框中,而不是在转换期间进行计算,然后在末尾添加行总计:
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
我有一个双人问题。在创建类似于我所拥有的数据集时,我们可以从 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 ](全部)小计?
我确定我们打算使用 dplyr
,也许完全而不是 dcast
,但是对于我来说,我找不到一个例子来证明小计排除.
第二个问题:类似地,我们也在尝试计算如何包含所有变量的每日平均值行,不包括 温度。所以数据集看起来像这样:
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。
而(全部)是臭氧的总和,Solar.R Temp -- 不包括 Wind。
我认为这是 dplyr
的另一种情况,这将是一个类似的解决方案,但我想我会问这两个问题。
编辑:值得一提的是,我的真实世界数据每个都有四个以上的变量'day',其中一些实际上并不是每天都出现,但仍然需要包含在每日'Day Avg' 和 '(all)' 计算,因此按名称排除变量会更清晰(即 Temp 或 Wind)而不是命名所有需要包含的变量(即 Ozone 和 Solar.R)。
下面的代码使用长格式数据计算两列汇总,然后将它们添加到长数据框中,而不是在转换期间进行计算,然后在末尾添加行总计:
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