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

就算我有:

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)])
555524 次浏览

也许你想要的是桌子?

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

若要获取包含唯一值计数的无量纲整数向量,请使用 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 指出这一点给我 给你

如果你需要在数据框架中将唯一值的数量作为一个额外的列来包含你的值(例如一个可以表示样本大小的列) ,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))
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")

如果你想在一个 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)
}

它是使用 aggregate的一行方法。

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


value count
1     1    25
2     2    75

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]

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

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

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

这对我有用,用你的矢量 v

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

备注: 将 maxsum 设置为足够大以捕获惟一值的数目

或与 magrittr软件包

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

另外,将值分类并调用 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

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

我知道还有很多其他的答案,但是这里有另一种方法可以使用 sortrle函数来实现。函数 rle代表 运行长度编码。它可以用于计算数字的运行次数(参见 rle上的 R man docs) ,但也可以在这里应用。

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

你也可以试试 dplyr::count

df <- tibble(x=c('a','b','b','c','c','d'), y=1:6)


dplyr::count(df, x, sort = TRUE)


# A tibble: 4 x 2
x         n
<chr> <int>
1 b         2
2 c         2
3 a         1
4 d         1