如何使用group_by和函数将函数映射到因子变量

时间:2018-02-06 03:51:06

标签: r dplyr purrr

我有一个包含大量分类变量的大型数据集,我想为其创建摘要。

考虑这个最小的例子。

library(dplyr)
library(purrr)    
set.seed(1)
dat <- data.frame(x = rep(LETTERS[1:4], times = c(2:5)),
                y = rep(letters[1:4], times = c(5:2)),
                z = rnorm(14))

我可以使用map创建频率表:

dat %>% select_if(is.character) %>% map(table)

出于某些原因,我想使用dplyr给我频率表。以下代码段工作。

dat %>% group_by(x) %>% summarise(n())

但以下情况并非如此。

dat %>% select_if(is.character) %>% 
    map(function(x) group_by(x) summarise(n())

这会引发以下错误:

Error: unexpected symbol in "dat %>% select_if(is.character) %>% map(function(x) group_by(x) summarise"

如何解决此错误?

1 个答案:

答案 0 :(得分:2)

您错过了管道%>%以及要传递给group_by的数据框:

dat %>% 
    select_if(is.factor) %>% 
    map(function(x) group_by(., x) %>% summarise(n = n()))

#$x
# A tibble: 4 x 2
#  x          n
#  <fctr> <int>
#1 A          2
#2 B          3
#3 C          4
#4 D          5

#$y
# A tibble: 4 x 2
#  x          n
#  <fctr> <int>
#1 A          2
#2 B          3
#3 C          4
#4 D          5

或者更好的方法是使用count

dat %>% select_if(is.factor) %>% map(function(x) count(., x))

#$x
# A tibble: 4 x 2
#  x          n
#  <fctr> <int>
#1 A          2
#2 B          3
#3 C          4
#4 D          5

#$y
# A tibble: 4 x 2
#  x          n
#  <fctr> <int>
#1 A          2
#2 B          3
#3 C          4
#4 D          5
相关问题