计算唯一值

gak*_*era 129 r unique count

比方说我有:

v = rep(c(1,2, 2, 2), 25)
Run Code Online (Sandbox Code Playgroud)

现在,我想计算每个唯一值出现的次数.unique(v) 返回唯一值的内容,但不返回它们的数量.

> unique(v)
[1] 1 2
Run Code Online (Sandbox Code Playgroud)

我想要一些能给我的东西

length(v[v==1])
[1] 25
length(v[v==2])
[1] 75
Run Code Online (Sandbox Code Playgroud)

但作为一个更一般的单线:)有点接近(但不完全)像这样:

#<doesn't work right> length(v[v==unique(v)])
Run Code Online (Sandbox Code Playgroud)

Cha*_*ase 170

也许桌子就是你追求的?

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
Run Code Online (Sandbox Code Playgroud)

  • 啊,是的,我可以使用它,稍作修改:t(as.data.frame(table(v))[,2])正是我需要的,谢谢 (7认同)
  • @Torvon - 当然,只需对结果使用`order()`.即`x < - as.data.frame(table(dummyData)); x [order(x $ Freq,减去= TRUE),]` (5认同)
  • 大通,有机会按频率订购吗?我有完全相同的问题,但是我的表中大约有20000个条目,我想知道最常见的条目有多频繁。 (2认同)

ant*_*ine 21

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

library("dplyr")
data %>% group_by(factor1, factor2) %>% summarize(count=n())
Run Code Online (Sandbox Code Playgroud)

它使用管道运算符%>%来链接数据帧上的方法调用data.

  • 或者,更短一点:“data %&gt;% count(factor1, Factor2)” (3认同)

Sea*_*ite 18

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

> aggregate(data.frame(count = v), list(value = v), length)

  value count
1     1    25
2     2    75
Run Code Online (Sandbox Code Playgroud)


C. *_*eng 10

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

确保安装了数据表包

install.packages("data.table")
Run Code Online (Sandbox Code Playgroud)

码:

# 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]
Run Code Online (Sandbox Code Playgroud)


Ben*_*Ben 8

要获得包含唯一值计数的无量纲整数向量,请使用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"
Run Code Online (Sandbox Code Playgroud)

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


Jef*_*son 7

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

  • 自从我提出这个问题以来,R 在过去 10 年里可能已经发展了很多。 (2认同)

sed*_*deh 6

另外,将值分类并调用summary()也可以。

> v = rep(as.factor(c(1,2, 2, 2)), 25)
> summary(v)
 1  2 
25 75 
Run Code Online (Sandbox Code Playgroud)


Ant*_*ert 5

这适合我.拿你的矢量v

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

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

或与magrittr包裹

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


Rom*_*man 5

您也可以尝试tidyverse

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