2013-08-05 46 views
19

Tôi có một vectơ các giá trị vô hướng mà tôi đang cố gắng lấy: "Có bao nhiêu giá trị khác nhau".Đếm số giá trị khác nhau trong một vector

Ví dụ: group <- c(1,2,3,1,2,3,4,6) giá trị duy nhất là 1,2,3,4,6 vì vậy tôi muốn nhận được 5.

tôi đến với:

length(unique(group)) 

Nhưng tôi không chắc chắn đó là cách hiệu quả nhất để làm điều đó. Không có cách nào tốt hơn để làm điều này?

Lưu ý: Trường hợp của tôi phức tạp hơn ví dụ, bao gồm khoảng 1000 số có tối đa 25 giá trị khác nhau.

Trả lời

26

Dưới đây là một vài ý tưởng, tất cả các điểm hướng tới giải pháp của bạn đã rất nhanh. length(unique(x)) là những gì tôi đã sử dụng cũng như:

x <- sample.int(25, 1000, TRUE) 

library(microbenchmark) 
microbenchmark(length(unique(x)), 
       nlevels(factor(x)), 
       length(table(x)), 
       sum(!duplicated(x))) 
# Unit: microseconds 
#     expr  min  lq median  uq  max neval 
# length(unique(x)) 24.810 25.9005 27.1350 28.8605 48.854 100 
# nlevels(factor(x)) 367.646 371.6185 380.2025 411.8625 1347.343 100 
#  length(table(x)) 505.035 511.3080 530.9490 575.0880 1685.454 100 
# sum(!duplicated(x)) 24.030 25.7955 27.4275 30.0295 70.446 100 
+0

Tôi sẽ thêm chiều dài (tabulate (x)) vào các hàm được kiểm tra. –

+0

@WojciechSobala: Không, thấy rằng 'chiều dài (tabulate (x))' không cho kết quả chính xác với ví dụ 'x <- mẫu (c (-3, 2, 5), 1000, TRUE)'. – flodel

+0

Không bao giờ tin tưởng (hoàn toàn) cảm giác ruột. ^^ Cảm ơn @flodel vì đã giúp tôi khám phá chức năng 'mẫu' và lib của microbenchmark! :) – AdrieanKhisbe

5

Tôi đã sử dụng chức năng này

length(unique(array)) 

và nó hoạt động tốt, và không đòi hỏi các thư viện bên ngoài.

+2

Tò mò lý do tại sao điều này đã được giảm xuống – allthesignals

+7

@allthesignals Tôi tò mò tại sao điều này đã được upvoted. Tôi không thấy câu trả lời này như thế nào? (Đó là "Không có cách nào tốt hơn để làm điều này?") – Calimo

3

Bạn có thể sử dụng rle từ base gói

x<-c(1,2,3,1,2,3,4,6) 
    length(rle(sort(x))$values) 

rle sản xuất hai vectơ (lengthsvalues). Độ dài của values vectơ cung cấp cho bạn số lượng giá trị duy nhất.

2

uniqueN chức năng từ data.table tương đương với length(unique(group)). Nó cũng nhanh hơn vài lần trên các tập dữ liệu lớn hơn, nhưng không nhiều hơn trong ví dụ của bạn.

library(data.table) 
library(microbenchmark) 

xSmall <- sample.int(25, 1000, TRUE) 
xBig <- sample.int(2500, 100000, TRUE) 
microbenchmark(length(unique(xSmall)), uniqueN(xSmall), 
       length(unique(xBig)), uniqueN(xBig)) 

#Unit: microseconds 
#     expr  min  lq  mean median  uq  max neval cld 
#1 length(unique(xSmall)) 17.742 24.1200 34.15156 29.3520 41.1435 104.789 100 a 
#2  uniqueN(xSmall) 12.359 16.1985 27.09922 19.5870 29.1455 97.103 100 a 
#3 length(unique(xBig)) 1611.127 1790.3065 2024.14570 1873.7450 2096.5360 3702.082 100 c 
#4   uniqueN(xBig) 790.576 854.2180 941.90352 896.1205 974.6425 1714.020 100 b 
Các vấn đề liên quan