【问题标题】:dplyr summary tables for list of columns列列表的 dplyr 汇总表
【发布时间】:2017-09-07 10:33:26
【问题描述】:

我有一个数据框:

role <- c("hi", "hi", "lo", "lo", "me", "me")
a <- c("w", "r","w", "r", "w", "r")
b <- c("z", "x","z", "x", "z", "x")
c <- c("o", "o","p", "p", "t", "y")

df <- data.frame(role, a, b, c)

要获得数据透视表样式摘要,其中roles 在a 列中具有哪些因子频率,我使用 dplyr:

summ <- df %>%
group_by(role, a) %>%
tally() %>%
spread(a, n, fill = 0)

summ

如何使用一个 dplyr 管道为所有列(abc)自动生成单独的数据透视表?

【问题讨论】:

    标签: r dplyr pivot-table


    【解决方案1】:

    这是一个使用tidyverse的选项

    library(tidyverse)
    names(df)[-1] %>% 
        map(~df %>% 
             select(.x, role) %>% 
             group_by(!!sym(.x), role) %>%
             tally() %>% 
             spread(!!sym(.x), n, fill = 0))
    #    [[1]]
    # A tibble: 3 x 3
    #    role     r     w
    #* <fctr> <dbl> <dbl>
    #1     hi     1     1
    #2     lo     1     1
    #3     me     1     1
    
    #[[2]]
    # A tibble: 3 x 3
    #    role     x     z
    #* <fctr> <dbl> <dbl>
    #1     hi     1     1
    #2     lo     1     1
    #3     me     1     1
    
    #[[3]]
    # A tibble: 3 x 5
    #    role     o     p     t     y
    #* <fctr> <dbl> <dbl> <dbl> <dbl>
    #1     hi     2     0     0     0
    #2     lo     0     2     0     0
    #3     me     0     0     1     1
    

    【讨论】:

    • 我试过你的代码,但得到了Error in sym(.x) : could not find function "sym"。除了tidyverse,你还用了哪些包?谢谢!
    • @thecatalyst 你可能需要library(rlang)
    【解决方案2】:

    一种方法,保留用于单个数据透视表的代码:

    library(dplyr); library(tidyr)
    
    df %>%
      gather(key, value, -role) %>%
      split(.$key) %>%
      lapply(function(x){x %>% group_by(role, value) %>%
          tally() %>%
          spread(value, n, fill = 0)})
    
    $a
    # A tibble: 3 x 3
    # Groups:   role [3]
       role     r     w
    * <chr> <dbl> <dbl>
    1    hi     1     1
    2    lo     1     1
    3    me     1     1
    
    $b
    # A tibble: 3 x 3
    # Groups:   role [3]
       role     x     z
    * <chr> <dbl> <dbl>
    1    hi     1     1
    2    lo     1     1
    3    me     1     1
    
    $c
    # A tibble: 3 x 5
    # Groups:   role [3]
       role     o     p     t     y
    * <chr> <dbl> <dbl> <dbl> <dbl>
    1    hi     2     0     0     0
    2    lo     0     2     0     0
    3    me     0     0     1     1
    

    【讨论】:

    • 那么在这个答案中,keyvalue 是什么?
    • key = a, b, c; value = 最初在这些列中的值。这两个变量在第一行的gather() 函数中定义。
    【解决方案3】:

    这在带有lapplytable 的基础R 中非常简单:

    lapply(df[-1], function(x) table(df$role, x))
    $a
        x
         r w
      hi 1 1
      lo 1 1
      me 1 1
    
    $b
        x
         x z
      hi 1 1
      lo 1 1
      me 1 1
    
    $c
        x
         o p t y
      hi 2 0 0 0
      lo 0 2 0 0
      me 0 0 1 1
    

    这将返回一个表对象列表。如果你想要一个 data.frames 列表,你可以这样做

    lapply(df[-1], function(x) as.data.frame.matrix(table(df$role, x)))
    

    【讨论】:

      【解决方案4】:

      仅供参考,您还使用 tidyr 进行收集,您可以使用 count 代替 group 然后 tally 以获得更简洁的管道。

      如果您想要一个列出所有组合的表格:

      library(tidyr)
      library(dplyr)
      
      df %>%
        gather(variable, value, -role) %>% 
        count(role, variable, value) %>% 
        spread(value, n, fill = 0)
      
          role variable     o     p     r     t     w     x     y     z
      * <fctr>    <chr> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
      1     hi        a     0     0     1     0     1     0     0     0
      2     hi        b     0     0     0     0     0     1     0     1
      3     hi        c     2     0     0     0     0     0     0     0
      4     lo        a     0     0     1     0     1     0     0     0
      5     lo        b     0     0     0     0     0     1     0     1
      6     lo        c     0     2     0     0     0     0     0     0
      7     me        a     0     0     1     0     1     0     0     0
      8     me        b     0     0     0     0     0     1     0     1
      9     me        c     0     0     0     1     0     0     1     0
      

      【讨论】:

      • 我在讨论分享一个类似的答案。我在末尾添加了%&gt;% select(role, variable, r, w, x, z, o, p, t, y) %&gt;% arrange(variable, role),以便将表格组合在一起以便于阅读。
      猜你喜欢
      • 2018-07-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-03-29
      • 2020-08-31
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多