r计算多个因子变量的分组计数

时间:2017-09-29 18:32:36

标签: r dplyr

出于演示目的,我有以下数据集:

df <- data.frame(A = as.factor(floor(runif(20,1,6))),
                 B = as.factor(floor(runif(20,1,6))),
                 C = as.factor(floor(runif(20,1,6))),
                 D = c(rep('X',3), rep("Y",7), rep('Z',10)))

如何迭代A,B和C列以获取

的计数
count(df, D, A), count(df, D, B) and count(df, D, C)

这是一个简化版本,如果我需要为20个或更多变量执行此操作,我该如何自动执行该过程?

我试过了:

f <- function(x) count(df, D, x)
result <- bind_rows(lapply(df[ , c('A','B','C')], f))

我收到以下错误:

 Error in grouped_df_impl(data, unname(vars), drop) : 
 Column `x` is unknown

2 个答案:

答案 0 :(得分:2)

使用tidyr::gather首先为您工作,以便您可以同时为不同的变量执行count所有操作吗?正如@alistaire在评论中指出的那样,这可以使用

完成

df %>% gather(key, value, -D) %>% count(D, key, value)

导致与我不必要的额外使用group_by

相同的输出

df %>% gather(key, value, -D) %>% group_by(D, key) %>% count(value)

工作解决方案

library(tidyverse)
df %>% gather(key, value, -D) %>% group_by(D, key) %>% count(value)
#> # A tibble: 34 x 4
#> # Groups:   D, key [9]
#>         D   key value     n
#>    <fctr> <chr> <chr> <int>
#>  1      X     A     2     1
#>  2      X     A     3     1
#>  3      X     A     4     1
#>  4      X     B     4     2
#>  5      X     B     5     1
#>  6      X     C     1     1
#>  7      X     C     3     2
#>  8      Y     A     1     1
#>  9      Y     A     3     3
#> 10      Y     A     5     3
#> # ... with 24 more rows

来源数据

set.seed(123)
df<-data.frame(A=as.factor(floor(runif(20,1,6))),
               B=as.factor(floor(runif(20,1,6))),
               C=as.factor(floor(runif(20,1,6))),
               D=c(rep('X',3),rep("Y",7),rep('Z',10)))  

答案 1 :(得分:1)

我们可以使用map2来处理涉及除&#39; D&#39;之外的列的列的子集count。用&#39; D&#39;

library(tidyverse)
lst <-  map2(names(df)[1:3], names(df)[4], ~count(df[c(.x, .y)], 
                           !!!rlang::syms(c(.x, .y))))


lst
#[[1]]
# A tibble: 11 x 3
#        A      D     n
#   <fctr> <fctr> <int>
# 1      1      Z     2
# 2      2      X     1
# 3      2      Y     1
# 4      2      Z     2
# 5      3      X     2
# 6      3      Y     2
# 7      3      Z     4
# 8      4      Y     2
# 9      4      Z     1
#10      5      Y     2
#11      5      Z     1

#[[2]]
# A tibble: 11 x 3
#        B      D     n
#   <fctr> <fctr> <int>
# 1      1      Y     2
# 2      1      Z     2
# 3      2      Y     1
# 4      2      Z     1
# 5      3      Y     1
# 6      3      Z     2
# 7      4      X     3
# 8      4      Y     2
# 9      4      Z     3
#10      5      Y     1
#11      5      Z     2

#[[3]]
# A tibble: 12 x 3
#        C      D     n
#   <fctr> <fctr> <int>
# 1      1      Y     1
# 2      1      Z     1
# 3      2      X     2
# 4      2      Y     1
# 5      2      Z     4
# 6      3      X     1
# 7      3      Y     2
# 8      3      Z     1
# 9      4      Y     2
#10      4      Z     3
#11      5      Y     1
#12      5      Z     1

目前尚不清楚是否拥有单个数据集或list数据集