2010-11-18 7 views
87

Hãy nói rằng tôi có:Đếm giá trị duy nhất

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

Bây giờ, tôi muốn đếm số lần mỗi giá trị duy nhất xuất hiện. unique(v) trả về giá trị duy nhất, nhưng không trả về giá trị của chúng.

> unique(v) 
[1] 1 2 

Tôi muốn một cái gì đó mang lại cho tôi

length(v[v==1]) 
[1] 25 
length(v[v==2]) 
[1] 75 

nhưng như một vị tướng thêm một-liner :) Một cái gì đó gần (nhưng không hoàn toàn) như thế này:

#<doesn't work right> length(v[v==unique(v)]) 
+9

Không, nhưng tôi googled "Đếm giá trị duy nhất trong R" tìm thấy điều gì hữu ích và bây giờ trang này là số 4 trong kết quả của tôi, và hy vọng sẽ giúp đỡ người khác là tốt, mà không chỉ nói với họ để đọc một cuốn sách để tìm câu trả lời này. – gakera

+7

Vâng, câu trả lời dưới đây đã giúp tôi và tiết kiệm thời gian cho tôi. Tôi cho rằng Chase đã không dành một thời gian dài để lắp ráp câu trả lời, nhưng nếu tôi lãng phí thời gian của mình thì tôi xin lỗi. Tôi đồng ý rằng cuộc thảo luận này là một sự lãng phí thời gian, tuy nhiên. Đây là một câu hỏi và câu trả lời trang web, tôi không tìm thấy câu trả lời này và bây giờ nó ở đây, làm thế nào là bất kỳ điều này xấu? Đừng lãng phí thời gian của bạn bằng cách nhìn vào những thứ bạn đã biết, thế nào? – gakera

+2

@garkera - Đây là danh sách hay tài nguyên tốt http://stats.stackexchange.com/questions/138/resources-for-learning-r – Chase

Trả lời

121

Có lẽ bảng là bạn đang làm gì?

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 
+5

Ah, vâng, tôi có thể sử dụng điều này, với một số sửa đổi nhỏ: t (as.data.frame (bảng (v)) [, 2]) là chính xác những gì tôi cần, cảm ơn bạn – gakera

+1

Tôi đã từng làm điều này một cách lúng túng với ' hist'. 'table' có vẻ chậm hơn một chút so với' hist'. Tôi tự hỏi tại sao. Có ai xác nhận không? – Museful

+1

Chase, mọi cơ hội để đặt hàng theo tần suất? Tôi có cùng một vấn đề chính xác, nhưng bảng của tôi có khoảng 20000 mục và tôi muốn biết mức độ thường xuyên của các mục phổ biến nhất. – Torvon

6

Để lấy một vector nguyên không có kích thước chứa số lượng giá trị duy nhất, hãy sử dụng 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" 

này có thể hữu ích nếu bạn cần để nuôi tội danh giá trị duy nhất vào chức năng khác, và là ngắn hơn và thành ngữ hơn t(as.data.frame(table(dummyData))[,2] được đăng trong một bình luận cho câu trả lời của Chase. Cảm ơn Ricardo Saporta đã chỉ ra điều này cho tôi here.

3

Nếu bạn cần phải có số lượng giá trị duy nhất là một cột bổ sung trong khung dữ liệu chứa giá trị của bạn (một cột có thể đại diện cho kích thước mẫu ví dụ), plyr cung cấp một cách gọn gàng:

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

hoặc 'ddply (data_frame,. (V), count)'. Cũng đáng làm cho nó rõ ràng rằng bạn cần một 'thư viện (" plyr ")' gọi để làm cho 'ddply' làm việc. –

+0

Có vẻ lạ khi sử dụng 'transform' thay vì' mutate' khi sử dụng 'plyr'. – Gregor

-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") 
+2

Đây là một giải pháp khá tiết kiệm khi bạn có thể dễ dàng sử dụng 'bảng' ... –

0

Nếu bạn muốn chạy duy nhất trên một data.frame (ví dụ, train.data), và cũng nhận được đếm (có thể được sử dụng như là trọng lượng trong phân loại), bạn có thể làm như sau:

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)                                               
} 
11

Đó là một sự chấp thuận một dòng ch bằng cách sử dụng aggregate.

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

    value count 
1  1 25 
2  2 75 
5

Chức năng bảng() là một cách tốt để thực hiện, như được đề xuất là Chase. Nếu bạn đang phân tích một tập dữ liệu lớn, một cách khác là sử dụng hàm .N trong gói dữ liệu.

Hãy chắc chắn rằng bạn đã cài đặt các gói bảng dữ liệu bằng cách

install.packages("data.table") 

Code:

# 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

Nếu bạn có nhiều yếu tố (= một khung dữ liệu đa chiều), bạn có thể sử dụng gói dplyr để tính các giá trị duy nhất trong mỗi kết hợp các yếu tố:

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

Nó sử dụng toán tử ống %>% để gọi phương thức chuỗi trên khung dữ liệu data.

0

Điều này phù hợp với tôi.Hãy vector của bạn v

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

Comment: set maxsum phải đủ lớn để nắm bắt số lượng giá trị duy nhất

hoặc qua các nhân magrittr gói

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

1

Cũng làm cho các giá trị phân loại và gọi summary() sẽ hoạt động.

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