计算每个唯一值的出现次数
Posted
技术标签:
【中文标题】计算每个唯一值的出现次数【英文标题】: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)])
【问题讨论】:
【参考方案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 <- 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())
它使用管道运算符%>%
链接数据帧data
上的方法调用。
【讨论】:
或者,更短一点:data %>% count(factor1, factor2)
【参考方案9】:
这对我有用。带上你的矢量v
length(summary(as.factor(v),maxsum=50000))
注释:将 maxsum 设置为足够大以捕获唯一值的数量
或使用magrittr
包
v %>% as.factor %>% summary(maxsum=50000) %>% 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】:我知道还有很多其他答案,但这里有另一种方法可以使用 sort
和 rle
函数。函数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
【讨论】:
以上是关于计算每个唯一值的出现次数的主要内容,如果未能解决你的问题,请参考以下文章