假设我有:
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)])
也许表格是你需要的?
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
dplyr
包来计算每种组合因素中独特值的数量。library("dplyr")
data %>% group_by(factor1, factor2) %>% summarize(count=n())
它使用管道操作符%>%
来链接数据框data
上的方法调用。
data %>% count(factor1, factor2)
- David使用aggregate
可以以一行代码的方式实现。
> aggregate(data.frame(count = v), list(value = v), length)
value count
1 1 25
2 2 75
length(unique(df$col))
是我所见过的最简单的方法。
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]
这对我有效。取你的向量v
length(summary(as.factor(v),maxsum=50000))
备注:将maxsum设置为足够大以捕获唯一值的数量。
或者使用magrittr
包
v %>% as.factor %>% summary(maxsum=50000) %>% length
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在这里向我指出了这一点。
summary()
也可以起作用。> v = rep(as.factor(c(1,2, 2, 2)), 25)
> summary(v)
1 2
25 75
tidyverse
。library(tidyverse)
dummyData %>%
as.tibble() %>%
count(value)
# A tibble: 2 x 2
value n
<dbl> <int>
1 1 25
2 2 75
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
正常工作。 - Brian Diggsplyr
时,使用transform
而不是mutate
似乎有些奇怪。 - Gregor Thomas
hist
来做这个有些尴尬。相比之下,table
似乎要慢得多。不知道为什么。有人能证实吗? - Musefulorder()
方法进行排序。例如:x <- as.data.frame(table(dummyData)); x[order(x$Freq, decreasing = TRUE), ]
- Chaselapply(DF, function(x) length(table(x)))
。 - Peter