【问题标题】:How to count how many values per level in a given factor?如何计算给定因子中每个级别有多少个值?
【发布时间】:2014-11-24 17:01:25
【问题描述】:

我有一个大约 2500 行的 data.frame mydf。这些行对应于列 1 mydf$V1 中的 69 类对象,我想计算每个对象类有多少行。 我可以通过以下方式获得这些类的一个因素:

objectclasses = unique(factor(mydf$V1, exclude="1"));

计算每个对象类的行数的简洁 R 方法是什么?如果这是任何其他语言,我会使用循环遍历数组并保持计数,但我是 R 编程新手,正在尝试利用 R 的向量化操作。

【问题讨论】:

标签: r count frequency


【解决方案1】:

这里有两种方法:

set.seed(1)
tt <- sample(letters,100,rep=TRUE)

## using table
table(tt)
tt
a b c d e f g h i j k l m n o p q r s t u v w x y z 
2 3 3 3 2 4 6 1 6 5 6 4 7 2 2 2 5 4 5 3 8 4 5 4 3 1 
## using tapply
tapply(tt,tt,length)
a b c d e f g h i j k l m n o p q r s t u v w x y z 
2 3 3 3 2 4 6 1 6 5 6 4 7 2 2 2 5 4 5 3 8 4 5 4 3 1 

【讨论】:

    【解决方案2】:

    或使用dplyr 库:

    library(dplyr)
    set.seed(1)
    dat <- data.frame(ID = sample(letters,100,rep=TRUE))
    dat %>% 
      group_by(ID) %>%
      summarise(no_rows = length(ID))
    

    注意%&gt;%的使用,类似于bash中管道的使用。实际上,上面的代码通过管道将dat 传递到group_by,并且该操作的结果通过管道传递到summarise

    结果是:

    Source: local data frame [26 x 2]
    
       ID no_rows
    1   a       2
    2   b       3
    3   c       3
    4   d       3
    5   e       2
    6   f       4
    7   g       6
    8   h       1
    9   i       6
    10  j       5
    11  k       6
    12  l       4
    13  m       7
    14  n       2
    15  o       2
    16  p       2
    17  q       5
    18  r       4
    19  s       5
    20  t       3
    21  u       8
    22  v       4
    23  w       5
    24  x       4
    25  y       3
    26  z       1
    

    请参阅dplyr introduction 了解更多上下文,以及有关各个功能的详细信息的文档。

    【讨论】:

    • 这正是我想要的。表格答案也很有用;数据存在一些问题,导致我暂时无法使用表格,因此我目前正在使用 data.frame。
    • 我是 R 新手,但似乎这个 dplyr 包是 R 的 jquery。它是很多事情的答案。
    • 使用table 会更好,因为它不需要额外的库。
    • ggplot2 实际上比graphics 提供了一个附加值,而在这种情况下,所提供的解决方案与table 的作用完全相同。我的评论指的是问题和手头的问题,不是关于包的一般性陈述。
    • 关于deplyr 可以做什么,我和你意见一致。我认为误解来自我的陈述。我不赞成普遍性!我的意思是,在这个问题的范围内,这种观点是有限的。给定因子ftable(f) 的作用与此解决方案建议的相同。
    【解决方案3】:

    使用plyr 包:

    library(plyr)
    
    count(mydf$V1)
    

    它将返回每个值的频率。

    【讨论】:

    • 这是我在这里能看到的最简单的方法,而且很有效。谢谢!
    【解决方案4】:

    使用data.table

     library(data.table)
     setDT(dat)[, .N, keyby=ID] #(Using @Paul Hiemstra's `dat`)
    

    或使用dplyr 0.3

     res <- count(dat, ID)
     head(res)
     #Source: local data frame [6 x 2]
    
     #  ID n
     #1  a 2
     #2  b 3
     #3  c 3
     #4  d 3
     #5  e 2
     #6  f 4
    

    或者

      dat %>% 
          group_by(ID) %>% 
          tally()
    

    或者

      dat %>% 
          group_by(ID) %>%
          summarise(n=n())
    

    【讨论】:

      【解决方案5】:

      我们可以在因子列上使用summary

      summary(myDF$factorColumn)
      

      【讨论】:

      • summary(ggplot2::diamonds$clarity) 看起来像是按预期执行的。
      • 这应该被接受为一种解决方案,它通过一个内置函数完成并准确输出所需内容。
      【解决方案6】:

      使用包 plyr 和 lapply 来获取数据框中每个值(级别)和每个变量(因子)的频率。

      library(plyr)
      lapply(df, count)
      

      【讨论】:

      【解决方案7】:

      另一种方法是应用 n() 函数来计算观察次数

      library(dplyr)
      library(magrittr)
      data %>% 
        group_by(columnName) %>%
        summarise(Count = n())
      

      【讨论】:

        【解决方案8】:

        如果我只想知道数据中存在多少个独特的因子水平,我会使用:

        length(unique(df$factorcolumn))
        

        【讨论】:

          【解决方案9】:

          这是一篇旧文章,但您可以使用基本 R 并且没有数据框/数据表来做到这一点:

          sapply(levels(yTrain), function(sLevel) sum(yTrain == sLevel))
          

          【讨论】:

            猜你喜欢
            • 2019-07-24
            • 1970-01-01
            • 2016-02-06
            • 1970-01-01
            • 1970-01-01
            • 2020-08-31
            • 2019-04-30
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多