首页 文章

计算唯一值

提问于
浏览
101

比方说我有:

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)])

11 回答

  • 0

    这适合我 . 拿你的矢量 v

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

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

    或者使用 magrittr

    v %>% as.factor %>% summary(maxsum=50000) %>% length

  • 2

    如果您需要将唯一值的数量作为包含值的数据框中的附加列(例如,可以表示样本大小的列),则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))
    
  • 15

    同时使值分类并调用 summary() 也可以 .

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

    你也可以试试 tidyverse

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

    也许 table 就是你追求的?

    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
    
  • 7

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

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

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

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

    它使用管道运算符 %>% 对数据框 data 进行链式方法调用 .

  • 4

    table()函数是一个很好的方法,如Chase建议的那样 . 如果要分析大型数据集,则另一种方法是在datatable包中使用.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]
    
  • -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 .

  • 2

    如果要在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)                                                                                                                                                                                           
    }
    
  • 140
    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")
    

相关问题