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


140

假设我有:

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

Answers:


179

也许桌子是你要的?

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 2010年

1
我以前用笨拙地做到这一点histtable似乎比慢很多hist。我想知道为什么。谁能确认?
Museful

2
追逐,有机会按频率订购吗?我有完全相同的问题,但是我的表中大约有20000个条目,我想知道最常见的条目有多频繁。
Torvon 2014年

5
@Torvon-当然,只使用order()结果即可。即x <- as.data.frame(table(dummyData)); x[order(x$Freq, decreasing = TRUE), ]
Chase

此方法不好,它仅适用于很少数据且重复很多的数据,不适用于大量连续数据且重复记录很少的数据。
深北地区

26

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

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

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


21

使用是一种单行方法aggregate

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

  value count
1     1    25
2     2    75

11

正如Chase所建议的那样,table()函数是一个不错的选择。如果要分析大型数据集,另一种方法是在数据表包中使用.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

要获取包含唯一值计数的无量纲整数向量,请使用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"

如果您需要将唯一值的计数输入到另一个函数中,这可能会很有用,并且比在t(as.data.frame(table(dummyData))[,2]Chase的答案的注释中张贴的更短,更惯用。感谢Ricardo Saporta 在这里向我指出了这一点


7

这对我有用。拿你的载体v

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

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

或与magrittr包装

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


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工作。
布莱恩·迪格斯

似乎很奇怪,transform而不是mutate使用时plyr
格雷戈尔·托马斯

3

也可以将值分类并调用summary()

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

2

您也可以尝试 tidyverse

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

0

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

0

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


自从我问了这个问题以来,R在过去10年中可能发展了很多。
gakera

-2
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")
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.