统计每个唯一值的出现次数

189

假设我有:

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)])
14个回答

222

也许表格是你需要的?

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
啊,是的,我可以使用这个,稍微修改一下:t(as.data.frame(table(v))[,2]) 正是我需要的,谢谢。 - gakera
1
我以前用 hist 来做这个有些尴尬。相比之下,table 似乎要慢得多。不知道为什么。有人能证实吗? - Museful
2
有没有按频率排序的机会?我有完全相同的问题,但我的表大约有20000个条目,我想知道最常见的条目有多频繁。 - Torvon
5
没问题,您可以在结果上使用 order() 方法进行排序。例如:x <- as.data.frame(table(dummyData)); x[order(x$Freq, decreasing = TRUE), ] - Chase
这种方法不太好,只适用于非常少量的数据且有很多重复,它将无法适应大量连续数据和少量重复记录。 - Deep North
要计算级别的数量,您也可以使用lapply(DF, function(x) length(table(x))) - Peter

42
如果你有多个因素(=一个多维数据框),你可以使用dplyr包来计算每种组合因素中独特值的数量。
library("dplyr")
data %>% group_by(factor1, factor2) %>% summarize(count=n())

它使用管道操作符%>%来链接数据框data上的方法调用。


3
或者更简短一些:data %>% count(factor1, factor2) - David

29

使用aggregate可以以一行代码的方式实现。

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

  value count
1     1    25
2     2    75

一行代码就能搞定,不需要使用unique()和其他的东西。太棒了! - Martin
注意:此处不包括NA值。 - dsg38
聚合是被低估的! - vonjd

17

length(unique(df$col)) 是我所见过的最简单的方法。


2
R在过去的10年中可能有很大的发展,自从我提出这个问题以来。 - gakera

13

table() 函数是一个不错的选择,正如 Chase 建议的那样。如果您要分析大型数据集,另一种选择是使用 datatable 包中的 .N 函数。

请确保您已经安装了 data table 包。

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]

7

这对我有效。取你的向量v

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

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

或者使用magrittr

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


7
要获取一个未定维度的整数向量,其中包含唯一值的计数,请使用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在这里向我指出了这一点。


6
同时将值转换为类别型并调用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

4
如果您需要在包含值的数据框中作为附加列使用唯一值的数量(例如可能代表样本大小的列),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))

3
或者使用ddply(data_frame,.(v),count)。还值得明确指出,需要调用library("plyr")以使ddply正常工作。 - Brian Diggs
在使用plyr时,使用transform而不是mutate似乎有些奇怪。 - Gregor Thomas

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接