统计独特的价值

假设我有:

v = rep(c(1,2, 2, 2), 25) 

现在,我要计算每个唯一值出现的次数。 unique(v)返回唯一值是什么,但不是多less。

 > 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 

这是一个使用aggregate的单线方法。

 > aggregate(data.frame(count = v), list(value = v), length) value count 1 1 25 2 2 75 

要获取包含唯一值计数的未标注整数vector,请使用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 在这里向我指出了这一点 。

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

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

它使用pipe道运算符%>%来链接dataframedata上的方法调用。

正如Chase所build议的,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] 

如果您需要将唯一值的数目作为包含您的值的数据框中的附加列(例如,可能表示样本大小的列),则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)) 

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

这对我有用。 把你的载体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 
 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")