在 R 中创建具有多个变量的汇总表
Creating Summary Tables with multiple variables in R
我正在尝试创建摘要 table 来汇总按 4 个变量分组的数据。理想情况下,将在顶部绘制 2 个变量,在侧面绘制 2 个变量。我附上了我用 Excel 中的数据创建的 table 以了解预期的最终产品。
这里有一些代码可以提供我正在使用的测试数据:
Zone <- c("Europe", "Europe", "Europe", "Europe", "USA", "USA", "Asia",
"Asia", "Europe", "USA", "Europe", "Europe")
Type <- c(1, 1, 2, 1, 1, 2, 1, 2, 1, 1, 2, 2)
Company <- c("Company1", "Company1", "Company4", "Company4", "Company2",
"Company2", "Company2", "Company5", "Company5", "Company5", "Company1",
"Company5")
Duration <- c(3, 3, 3, 1, 3, 2, 5, 5, 5, 4, 4, 4)
Value <- c(1000, 1000, 2000, 2000, 1500, 1300, 6000, 2000, 1000, 1200, 3000,
3000)
df <- data.frame(Zone, Type, Company, Duration, Value)
我需要显示 "value" 的总和,首先按区域划分,然后按 "Type"(绘制在 table 的顶部)。在此之后应该进一步按 "Company" 拆分,然后 "Duration"(绘制在 table 的左侧)。请参阅附图!显示所有因素非常重要,即使数据在row/column 全部为 0 或 NA。
此外,我需要复制完全相同的 table 但使用 COUNT(length) 函数而不是 SUM。
如有任何想法,我们将不胜感激!
使这变得有点复杂的是,您想要在解决方案中表示的值在数据框中没有,例如 "Company3." 的所有值我的解决方案是创建一个 "anchor" 数据框包含 Company
和 Duration
的所有组合,然后向左加入摘要 table。最后,将值为 NA
的位置设置为 0
.
library(dplyr)
# Create anchor dataframe
anchor <- data.frame(Company = rep(c("Company1","Company2","Company3","Company4","Company5"),each=5),
Duration = rep(c(1:5),5),
stringsAsFactors = F)
# Summarize data
summary <- df %>%
group_by(Zone,Type,Company,Duration) %>%
summarise(stat = sum(Value)) %>% # summarise as desired
ungroup() %>%
mutate(Zone.Type = paste0(Zone,".",Type)) %>%
select(-Zone,-Type) %>%
spread(key = Zone.Type, value = stat, fill = 0)
# Join the anchor to the summary
final <- left_join(anchor,summary,by = c("Company","Duration")) %>%
arrange(Company,Duration)
# Set all NA to 0
final[is.na(final)] <- 0
这将给出以下结果:
Company Duration Asia.1 Asia.2 Europe.1 Europe.2 USA.1 USA.2
1 Company1 1 0 0 0 0 0 0
2 Company1 2 0 0 0 0 0 0
3 Company1 3 0 0 2000 0 0 0
4 Company1 4 0 0 0 3000 0 0
5 Company1 5 0 0 0 0 0 0
6 Company2 1 0 0 0 0 0 0
7 Company2 2 0 0 0 0 0 1300
8 Company2 3 0 0 0 0 1500 0
9 Company2 4 0 0 0 0 0 0
10 Company2 5 6000 0 0 0 0 0
11 Company3 1 0 0 0 0 0 0
12 Company3 2 0 0 0 0 0 0
13 Company3 3 0 0 0 0 0 0
14 Company3 4 0 0 0 0 0 0
15 Company3 5 0 0 0 0 0 0
16 Company4 1 0 0 2000 0 0 0
17 Company4 2 0 0 0 0 0 0
18 Company4 3 0 0 0 2000 0 0
19 Company4 4 0 0 0 0 0 0
20 Company4 5 0 0 0 0 0 0
21 Company5 1 0 0 0 0 0 0
22 Company5 2 0 0 0 0 0 0
23 Company5 3 0 0 0 0 0 0
24 Company5 4 0 0 0 3000 1200 0
25 Company5 5 0 2000 1000 0 0 0
数据框不能像您提供的类似 excel 的输出那样具有合并单元格,但我认为这是一个很好的近似值。在上面指示的地方替换您选择的汇总统计量。
我正在尝试创建摘要 table 来汇总按 4 个变量分组的数据。理想情况下,将在顶部绘制 2 个变量,在侧面绘制 2 个变量。我附上了我用 Excel 中的数据创建的 table 以了解预期的最终产品。
这里有一些代码可以提供我正在使用的测试数据:
Zone <- c("Europe", "Europe", "Europe", "Europe", "USA", "USA", "Asia",
"Asia", "Europe", "USA", "Europe", "Europe")
Type <- c(1, 1, 2, 1, 1, 2, 1, 2, 1, 1, 2, 2)
Company <- c("Company1", "Company1", "Company4", "Company4", "Company2",
"Company2", "Company2", "Company5", "Company5", "Company5", "Company1",
"Company5")
Duration <- c(3, 3, 3, 1, 3, 2, 5, 5, 5, 4, 4, 4)
Value <- c(1000, 1000, 2000, 2000, 1500, 1300, 6000, 2000, 1000, 1200, 3000,
3000)
df <- data.frame(Zone, Type, Company, Duration, Value)
我需要显示 "value" 的总和,首先按区域划分,然后按 "Type"(绘制在 table 的顶部)。在此之后应该进一步按 "Company" 拆分,然后 "Duration"(绘制在 table 的左侧)。请参阅附图!显示所有因素非常重要,即使数据在row/column 全部为 0 或 NA。
此外,我需要复制完全相同的 table 但使用 COUNT(length) 函数而不是 SUM。
如有任何想法,我们将不胜感激!
使这变得有点复杂的是,您想要在解决方案中表示的值在数据框中没有,例如 "Company3." 的所有值我的解决方案是创建一个 "anchor" 数据框包含 Company
和 Duration
的所有组合,然后向左加入摘要 table。最后,将值为 NA
的位置设置为 0
.
library(dplyr)
# Create anchor dataframe
anchor <- data.frame(Company = rep(c("Company1","Company2","Company3","Company4","Company5"),each=5),
Duration = rep(c(1:5),5),
stringsAsFactors = F)
# Summarize data
summary <- df %>%
group_by(Zone,Type,Company,Duration) %>%
summarise(stat = sum(Value)) %>% # summarise as desired
ungroup() %>%
mutate(Zone.Type = paste0(Zone,".",Type)) %>%
select(-Zone,-Type) %>%
spread(key = Zone.Type, value = stat, fill = 0)
# Join the anchor to the summary
final <- left_join(anchor,summary,by = c("Company","Duration")) %>%
arrange(Company,Duration)
# Set all NA to 0
final[is.na(final)] <- 0
这将给出以下结果:
Company Duration Asia.1 Asia.2 Europe.1 Europe.2 USA.1 USA.2
1 Company1 1 0 0 0 0 0 0
2 Company1 2 0 0 0 0 0 0
3 Company1 3 0 0 2000 0 0 0
4 Company1 4 0 0 0 3000 0 0
5 Company1 5 0 0 0 0 0 0
6 Company2 1 0 0 0 0 0 0
7 Company2 2 0 0 0 0 0 1300
8 Company2 3 0 0 0 0 1500 0
9 Company2 4 0 0 0 0 0 0
10 Company2 5 6000 0 0 0 0 0
11 Company3 1 0 0 0 0 0 0
12 Company3 2 0 0 0 0 0 0
13 Company3 3 0 0 0 0 0 0
14 Company3 4 0 0 0 0 0 0
15 Company3 5 0 0 0 0 0 0
16 Company4 1 0 0 2000 0 0 0
17 Company4 2 0 0 0 0 0 0
18 Company4 3 0 0 0 2000 0 0
19 Company4 4 0 0 0 0 0 0
20 Company4 5 0 0 0 0 0 0
21 Company5 1 0 0 0 0 0 0
22 Company5 2 0 0 0 0 0 0
23 Company5 3 0 0 0 0 0 0
24 Company5 4 0 0 0 3000 1200 0
25 Company5 5 0 2000 1000 0 0 0
数据框不能像您提供的类似 excel 的输出那样具有合并单元格,但我认为这是一个很好的近似值。在上面指示的地方替换您选择的汇总统计量。