【问题标题】:count the occurrence of categorical variables in R计算 R 中分类变量的出现次数
【发布时间】:2017-11-21 09:55:42
【问题描述】:

我有一个由三个分类变量组成的数据框,我想找到每个组合的频率,并按频率降序对结果进行排序,如下所示:

我的数据:

   A LEVEL1 PASS
   A LEVEL1 FAIL
   B LEVEL2 PASS
   A LEVEL1 PASS
   B LEVEL2 PASS
   A LEVEL1 PASS

结果应该如下:

   A LEVEL1 PASS 3
   B LEVEL2 PASS 2
   A LEVEL1 FAIL 1

我使用 plyr 库,

  myfreq<-count(myresult,vars = NULL, wt_var = NULL) 
  myfreq<-myfreq[order-myfreq$freq,] 
 

一开始,它可以工作,但它只是给了我这个错误:

grouped_df_impl(data, unname(vars), drop) 中的错误: 列vars 未知

我使用的其他库是rJavadplyr

谢谢

【问题讨论】:

    标签: r count find-occurrences


    【解决方案1】:

    我建议使用dplyr,它包含在tidyverse 包中。

    我不知道你的数据框中的列的名称是什么,所以我在下面的示例中将它们命名为 col1col2col3

    library(tidyverse)
    
    df <- tribble(
      ~ col1, ~col2, ~col3,
      "A", "LEVEL1", "PASS",
      "A", "LEVEL1", "FAIL",
      "A", "LEVEL1", "PASS",
      "B", "LEVEL2", "PASS",
      "A", "LEVEL1", "PASS")
    
    # here is where the magic happens
    df %>% count(col1, col2, col3, sort = TRUE)
    

    【讨论】:

      【解决方案2】:

      您可以在 dplyr 中使用 group_by:

      library(dplyr)
      
      
      x <- data.frame(letter = c("A", "A", "B", "A", "B", "A"), level = c("LEVEL 1", "LEVEL 1", "LEVEL 2", "LEVEL 1", "LEVEL 2", "LEVEL 1"), text = c("PASS", "FAIL", "PASS", "PASS", "PASS", "PASS"))
      
      df <- x %>%
           group_by_all() %>%
           count()
      

      或者你可以这样做:

      df <- x %>%
           group_by(letter, level, text) %>%
           count()
      

      输出:

      > df <- x %>% group_by_all() %>% count()
      > df
      # A tibble: 3 x 4
      # Groups:   x, y, z [3]
             x       y      z     n
        <fctr>  <fctr> <fctr> <int>
      1      A LEVEL 1   FAIL     1
      2      A LEVEL 1   PASS     3
      3      B LEVEL 2   PASS     2
      

      【讨论】:

      • 为什么在count之前使用group_by
      • 我想如果 df 中还有其他列。但我想你是对的,只需要计数即可。
      【解决方案3】:

      您可以使用table 函数。

      ex <- data.frame("letter" = c("A", "A", "B", "A", "B", "A"),
                       "level" = c("LEVEL1", "LEVEL1", "LEVEL2", "LEVEL1", "LEVEL2", "LEVEL1"),
                       "test" = c("PASS", "FAIL", rep("PASS", 4)))
      
      
      ex
      
      res <- data.frame(table(ex$level, ex$test))
      colnames(res) <- c("level", "test", "freq")
      

      您可以稍后将结果 data.frame 与原始的合并。

      【讨论】:

      • 谢谢大家,我只是想知道dplyr和plyr之间有冲突吗?
      【解决方案4】:

      这里是带有 n() 的 tidyverse

      df <- tibble(
        id = c("A", "A", "B", "A", "B", "A"),
        level = c("LEVEL1", "LEVEL1", "LEVEL2", "LEVEL1", "LEVEL2", "LEVEL1"),
        type = factor(c("PASS", "FAIL", "PASS", "PASS", "PASS", "PASS"))
      )
      
      df %>% 
        group_by(id, level, type) %>%
        summarise(n = n()) %>%
        arrange(desc(n))
      
      # A tibble: 3 x 4
      # Groups:   id, level [?]
           id  level   type     n
        <chr>  <chr> <fctr> <int>
      1     A LEVEL1   FAIL     1
      2     A LEVEL1   PASS     3
      3     B LEVEL2   PASS     2
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2017-11-03
        • 2014-07-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-01-18
        • 1970-01-01
        • 2015-03-20
        相关资源
        最近更新 更多