代码之家  ›  专栏  ›  技术社区  ›  Eric Green

dplyr将共享相同“级别”的几个变量制成表格(摘要)的方法

  •  2
  • Eric Green  · 技术社区  · 8 年前

    什么是 dplyr 如何将共享相同“级别”的几个变量制成表格,以生成以下输出?

    df <- data.frame(v1 = c("sometimes", "sometimes", "rarely", "never", "often",
                            "often"),
                     v2 = c("often", "sometimes", "rarely", "never", "rarely",
                            "often"))
    
    tab <- data.frame(cbind(table(df$v1), table(df$v2)))
    names(tab) <- names(df) 
    tab
    
    #          v1 v2
    #never      1  1
    #often      2  2
    #rarely     1  2
    #sometimes  2  1
    
    2 回复  |  直到 8 年前
        1
  •  3
  •   Jilber Urbina    8 年前

    您可以使用以下方法:

    > df %>% 
        gather(var) %>% 
        group_by(var) %>% 
        count(value) %>% 
        spread(var, n)
    # A tibble: 4 x 3
      value        v1    v2
      <chr>     <int> <int>
    1 never         1     1
    2 often         2     2
    3 rarely        1     2
    4 sometimes     2     1
    

    正如@Frank所指出的那样,你可以直接走 group_by count() ,如下所示:

      df %>% 
      gather %>% 
      count(key,value) %>% 
      spread(key, n)
    
        2
  •  1
  •   jdobres    8 年前

    一种方法是将数据转换为“long”格式,这样可以更容易地计算标签的出现次数,然后 spread 将它们转换成所需的格式。

    df.count <- df %>% 
      gather(variable, value) %>% 
      group_by(variable, value) %>% 
      count %>% 
      spread(variable, n)
    
      value        v1    v2
      <chr>     <int> <int>
    1 never         1     1
    2 often         2     2
    3 rarely        1     2
    4 sometimes     2     1
    

    当然, dplyr

    df2 <- sapply(df, table)
    

    这将生成一个命名矩阵,而不是一个数据帧:

              v1 v2
    never      1  1
    often      2  2
    rarely     1  2
    sometimes  2  1
    

    df2 <- sapply(df, table) %>% 
      as.data.frame %>% 
      rownames_to_column(var = 'level')