在R中创建包含多个变量的汇总表

时间:2017-09-19 15:04:07

标签: r aggregate tabular summary

我正在尝试创建一个汇总表来汇总按4个变量分组的数据。理想情况下,将在顶部绘制2个变量,在侧面绘制2个变量。我附上了一张我用Excel中的数据创建的表格,以便了解预期的最终产品。

以下是一些提供我正在使用的测试数据的代码:

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)

我需要首先显示按区域划分的“值”的SUM,然后按“类型”显示(在表格的顶部绘制。在此之后,它应该进一步拆分为“公司”然后“持续时间” (绘制在表格的左侧)。请参见附图!即使行/列上的数据全部为0或NA,显示所有因子也非常重要。Example Image

另外,我需要复制完全相同的表,但使用COUNT(长度)函数而不是SUM。

任何想法都将不胜感激!

1 个答案:

答案 0 :(得分:1)

使这一点变得复杂的原因是,您希望在解决方案中表示您在数据框中没有的值,例如“Company3”的所有值。我的解决方案是创建一个“锚点”数据框,其中包含CompanyDuration的所有组合,然后左边加入一个汇总表。最后,如果值为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的输出那样合并单元格,但我认为这是一个很好的近似值。替换上面指出的您选择的摘要统计。