【问题标题】:Count number of occurences for each unique value计算每个唯一值的出现次数
【发布时间】:2011-05-12 00:54:53
【问题描述】:

假设我有:

v = rep(c(1,2, 2, 2), 25)

现在,我想计算每个唯一值出现的次数。 unique(v) 返回唯一值是什么,但不返回它们的数量。

> unique(v)
[1] 1 2

我想要一些能给我的东西

length(v[v==1])
[1] 25
length(v[v==2])
[1] 75

但作为更一般的单线:) 类似这样的接近(但不完全)的东西:

#<doesn't work right> length(v[v==unique(v)])

【问题讨论】:

    标签: r count unique


    【解决方案1】:

    也许桌子就是你所追求的?

    dummyData = rep(c(1,2, 2, 2), 25)
    
    table(dummyData)
    # dummyData
    #  1  2 
    # 25 75
    
    ## or another presentation of the same data
    as.data.frame(table(dummyData))
    #    dummyData Freq
    #  1         1   25
    #  2         2   75
    

    【讨论】:

    • 啊,是的,我可以使用它,稍作修改:t(as.data.frame(table(v))[,2]) 正是我需要的,谢谢跨度>
    • 我以前用hist 做这件事很尴尬。 table 似乎比 hist 慢很多。我想知道为什么。谁能确认一下?
    • Chase,有机会按频率订购吗?我有完全相同的问题,但我的表大约有 20000 个条目,我想知道最常见的条目的频率。
    • @Torvon - 当然,只需在结果上使用order()。即x &lt;- as.data.frame(table(dummyData)); x[order(x$Freq, decreasing = TRUE), ]
    • 这个方法不好,只适合极少重复的数据,不适合大量重复记录少的连续数据。
    【解决方案2】:

    要获取包含唯一值计数的无维度整数向量,请使用c()

    dummyData = rep(c(1, 2, 2, 2), 25) # Chase's reproducible data
    c(table(dummyData)) # get un-dimensioned integer vector
     1  2 
    25 75
    
    str(c(table(dummyData)) ) # confirm structure
     Named int [1:2] 25 75
     - attr(*, "names")= chr [1:2] "1" "2"
    

    如果您需要将唯一值的计数提供给另一个函数,这可能很有用,并且比在对 Chase 的答案的评论中发布的 t(as.data.frame(table(dummyData))[,2] 更短、更惯用。感谢 Ricardo Saporta 向我指出了这一点here

    【讨论】:

      【解决方案3】:

      如果您需要将唯一值的数量作为包含您的值的数据框中的附加列(例如可能代表样本大小的列),plyr 提供了一种简洁的方法:

      data_frame <- data.frame(v = rep(c(1,2, 2, 2), 25))
      
      library("plyr")
      data_frame <- ddply(data_frame, .(v), transform, n = length(v))
      

      【讨论】:

      • ddply(data_frame, .(v), count)。同样值得明确指出,您需要一个 library("plyr") 调用才能使 ddply 工作。
      • 在使用plyr 时使用transform 而不是mutate 似乎很奇怪。
      【解决方案4】:
      count_unique_words <-function(wlist) {
      ucountlist = list()
      unamelist = c()
      for (i in wlist)
      {
      if (is.element(i, unamelist))
          ucountlist[[i]] <- ucountlist[[i]] +1
      else
          {
          listlen <- length(ucountlist)
          ucountlist[[i]] <- 1
          unamelist <- c(unamelist, i)
          }
      }
      ucountlist
      }
      
      expt_counts <- count_unique_words(population)
      for(i in names(expt_counts))
          cat(i, expt_counts[[i]], "\n")
      

      【讨论】:

        【解决方案5】:

        如果您想在 data.frame(例如 train.data)上运行唯一的,并获得计数(可以用作分类器中的权重),您可以执行以下操作:

        unique.count = function(train.data, all.numeric=FALSE) {                                                                                                                                                                                                 
          # first convert each row in the data.frame to a string                                                                                                                                                                              
          train.data.str = apply(train.data, 1, function(x) paste(x, collapse=','))                                                                                                                                                           
          # use table to index and count the strings                                                                                                                                                                                          
          train.data.str.t = table(train.data.str)                                                                                                                                                                                            
          # get the unique data string from the row.names                                                                                                                                                                                     
          train.data.str.uniq = row.names(train.data.str.t)                                                                                                                                                                                   
          weight = as.numeric(train.data.str.t)                                                                                                                                                                                               
          # convert the unique data string to data.frame
          if (all.numeric) {
            train.data.uniq = as.data.frame(t(apply(cbind(train.data.str.uniq), 1, 
              function(x) as.numeric(unlist(strsplit(x, split=","))))))                                                                                                    
          } else {
            train.data.uniq = as.data.frame(t(apply(cbind(train.data.str.uniq), 1, 
              function(x) unlist(strsplit(x, split=",")))))                                                                                                    
          }
          names(train.data.uniq) = names(train.data)                                                                                                                                                                                          
          list(data=train.data.uniq, weight=weight)                                                                                                                                                                                           
        }  
        

        【讨论】:

          【解决方案6】:

          这是一种使用aggregate 的单行方法。

          > aggregate(data.frame(count = v), list(value = v), length)
          
            value count
          1     1    25
          2     2    75
          

          【讨论】:

          • 确实是单线而不是使用 unique() + 其他东西。太棒了!
          • 注意:这不包括 NA 值
          【解决方案7】:

          table() 函数是一个很好的方法,正如Chase 所建议的那样。 如果您正在分析大型数据集,另一种方法是使用数据表包中的 .N 函数。

          确保你安装了数据表包

          install.packages("data.table")
          

          代码:

          # Import the data.table package
          library(data.table)
          
          # Generate a data table object, which draws a number 10^7 times  
          # from 1 to 10 with replacement
          DT<-data.table(x=sample(1:10,1E7,TRUE))
          
          # Count Frequency of each factor level
          DT[,.N,by=x]
          

          【讨论】:

            【解决方案8】:

            如果您有多个因子(= 多维数据框),您可以使用 dplyr 包计算每个因子组合中的唯一值:

            library("dplyr")
            data %>% group_by(factor1, factor2) %>% summarize(count=n())
            

            它使用管道运算符%&gt;% 链接数据帧data 上的方法调用。

            【讨论】:

            • 或者,更短一点:data %&gt;% count(factor1, factor2)
            【解决方案9】:

            这对我有用。带上你的矢量v

            length(summary(as.factor(v),maxsum=50000))

            注释:将 maxsum 设置为足够大以捕获唯一值的数量

            或使用magrittr

            v %&gt;% as.factor %&gt;% summary(maxsum=50000) %&gt;% length

            【讨论】:

              【解决方案10】:

              还可以将值设为分类并调用summary()

              > v = rep(as.factor(c(1,2, 2, 2)), 25)
              > summary(v)
               1  2 
              25 75 
              

              【讨论】:

                【解决方案11】:

                你也可以试试tidyverse

                library(tidyverse) 
                dummyData %>% 
                    as.tibble() %>% 
                    count(value)
                # A tibble: 2 x 2
                  value     n
                  <dbl> <int>
                1     1    25
                2     2    75
                

                【讨论】:

                  【解决方案12】:

                  length(unique(df$col)) 是我能看到的最简单的方式。

                  【讨论】:

                  • 自从我提出这个问题以来,R 在过去 10 年中可能已经发展了很多。
                  【解决方案13】:

                  我知道还有很多其他答案,但这里有另一种方法可以使用 sortrle 函数。函数rle 代表运行长度编码。它可用于计数运行次数(请参阅rle 上的 R 手册文档),但也可以在此处应用。

                  test.data = rep(c(1, 2, 2, 2), 25)
                  rle(sort(test.data))
                  ## Run Length Encoding
                  ##   lengths: int [1:2] 25 75
                  ##   values : num [1:2] 1 2
                  

                  如果您捕获结果,您可以按如下方式访问长度和值:

                  ## rle returns a list with two items.
                  result.counts <- rle(sort(test.data))
                  result.counts$lengths
                  ## [1] 25 75
                  result.counts$values
                  ## [1] 1 2
                  

                  【讨论】:

                    猜你喜欢
                    • 2012-10-25
                    • 1970-01-01
                    • 2015-10-28
                    • 1970-01-01
                    • 1970-01-01
                    • 2021-07-25
                    • 1970-01-01
                    • 1970-01-01
                    • 1970-01-01
                    相关资源
                    最近更新 更多