通过使用group_split和group_map将变量分组来使用tabyl制表

时间:2019-10-24 22:48:54

标签: r group-by dplyr purrr janitor

要一次获得一列或多列的快速频率(制表),我可以使用tabyl函数,如下所示:

library(janitor)
library(tidyverse)

#tabulate one column at a time
iris %>% 
  tabyl(Petal.Width)

#tabulate multiple columns at once using map
iris %>% 
  select(Petal.Width, Petal.Length) %>% 
  map(tabyl)

我正在尝试复制这两种情况,但是通过分组变量Species来输出输出。我想要最简单的解决方案,并且想尝试使用更新的group_splitgroup_map命令。

我已经能够以数据帧格式生成类似类型的输出(尽管对于多个变量,tabyl生成的简单列表正是我想要的):

#works 
iris %>%
  group_by(Species) %>%
  nest() %>% 
  mutate(out = map(data, ~ tabyl(.x$Petal.Width) %>% 
                     as_tibble)) %>% 
  select(-data) %>%
  unnest

这行得通,但是我想它可能会更简单一些,例如我的列方法,我正在为每个分组变量的一列考虑类似的事情:

#by group for one column
iris %>% 
  group_by(Species) %>% 
  group_split() %>% 
  map(~tabyl(Petal.Width))

对于多列,我不确定是否需要此处的选择行?也许group_map可以将其简化为一行?

#by group for multiple columns
iris %>% 
  #do i need to select grouping variable and variables of interest?
  select(Species, Petal.Width, Petal.Length) %>% 
  group_by(Species) %>% 
  group_split() %>% 
  map(~tabyl())   #could I use group_map and select the columns at once?

有什么建议吗?

1 个答案:

答案 0 :(得分:1)

  iris %>% 
       #use split(.$Species) if you need a list with names 
       group_split(Species) %>% 
       map(~imap(.x %>%select(Species, Petal.Width, Petal.Length), 
                  function(x,y){
                          out <-tabyl(x)
                          colnames(out)[1]=y
                          out}))

如果您需要第一列的默认列名称,则可以执行iris %>% group_split(Species) %>% map(~map(.x, tabyl))