使用dplyr对因子变量的级别求和,保持0次出现的组

时间:2016-12-28 21:49:38

标签: r dplyr tidyr complete

我在使用dplyrtidyr从我的数据框生成新的摘要列时遇到问题。我有一个df,它包含两个因子变量A和B,每个变量都有很多(> 10)级别。对于因子变量A的每个级别,我想计算变量B的特定级别的所有出现次数,并将它们存储在新列中。
然后我想用不同级别的B重复这个并将它们存储在第二列中。在每个汇总步骤中,我需要保持0次出现的组 我从nycflights13 df创建了一个示例来说明我的问题。

flights$carriers有16个级别。对于每一个,我想知道它到这些目的地的航班总数,用flights$dest编码:ALB,BUF,ROC和SYR,包括该航空公司是否有0个航班飞往这些目的地。
我也想知道只有ALB + SYR的飞行总和(所以我可以用ALB + BUF + ROC + SYR绘制ALB + SYR的百分比)。
下面的代码有效,但我正在寻找最简洁的方法,我猜这不是它。要让complete()以我想要的方式工作,我必须先将destcarrier转换为因子。

flights$carrier <- as.factor(flights$carrier)
flights$dest <- as.factor(flights$dest)

## count occurrences of ALB+SYR+ROC+BUF
summary <- flights %>% 
 group_by(carrier, dest) %>%
 summarise(count = n()) %>% 
 complete(dest, fill = list(count = 0)) %>%
 filter(dest == "ALB"|dest == "BUF"|dest == "ROC"|dest == "SYR") %>%
 ungroup() %>%
 group_by(carrier) %>%
 summarise(upstate_total = sum(count))

## count occurrences of only ALB + SYR
alb_syr <- flights %>% 
 group_by(carrier, dest) %>%
 summarise(count = n()) %>% 
 complete(dest, fill = list(count = 0)) %>%
 filter(dest == "ALB"|dest == "SYR") %>%
 ungroup() %>%
 group_by(carrier) %>%
 summarise(alb_syr_count = sum(count)) %>%
 select(alb_syr_count) %>%
 unlist()

## bind to summary df
summary$alb_syr <- alb_syr

注意:最初,我认为先过滤,然后分组和汇总会更简单,但我不能让complete()从过滤的df继承组。相反,它继承自原始 flights df。当我在下面执行时,dest的所有级别都出现在输出中,而不仅仅是我过滤的那些级别:

subset <- flights %>%
 filter(dest == "ALB"|dest == "BUF"|dest == "ROC"|dest == "SYR")

summary2 <- subset %>%
 group_by(carrier, dest) %>%
 summarise(count = n()) %>%
 complete(dest, fill = list( count = 0)) 

提前感谢您的帮助!!我正在使用一个旧的Mac OS,因此在我的软件包版本中受到一些限制,并希望得到与我所拥有的一致的答案。

> sessionInfo()
R version 3.2.1 (2015-06-18)
Platform: x86_64-apple-darwin10.8.0 (64-bit)
Running under: OS X 10.7.5 (Lion)

locale:
[1] en_US.UTF-8/en_US.UTF-8/en_US.UTF-8/C/en_US.UTF-8/en_US.UTF-8

attached base packages:
[1] stats     graphics  grDevices utils     datasets  methods   base     

other attached packages:
[1] nycflights13_0.2.0 RColorBrewer_1.1-2 reshape2_1.4.1     ggplot2_2.0.0          
purrr_0.2.2       
[6] dplyr_0.4.3        tidyr_0.4.0       

loaded via a namespace (and not attached):
[1] Rcpp_0.12.3      assertthat_0.1   grid_3.2.1       R6_2.1.2            
plyr_1.8.3       gtable_0.2.0    
[7] DBI_0.3.1        magrittr_1.5     scales_0.4.0     stringi_1.0-1      
lazyeval_0.2.0   tools_3.2.1     
[13] stringr_1.0.0    munsell_0.4.3    parallel_3.2.1   colorspace_1.2-6    
knitr_1.12.3    

0 个答案:

没有答案