2013-06-28 31 views
25

Tôi có một vector nóiTìm các yếu tố phổ biến nhất trong một vector trong R

c(1,1,1,1,1,1,2,3,4,5,7,7,5,7,7,7) 

Làm thế nào để tìm ra tội danh từng yếu tố và trả lại 3 yếu tố thường xuyên nhất xảy ra, ví dụ: 1, 7, 5?

Tôi nghĩ điều này nên thực sự đơn giản nhưng tôi gặp sự cố với điều này.

+1

bạn có thể sử dụng bảng() .. xem http://stackoverflow.com/questions/1923273/counting-the-number-of-elements-with-the-values-of-x-in-a-vector – cobie

Trả lời

53

Tôi chắc chắn đây là một bản sao, nhưng câu trả lời rất đơn giản:

sort(table(variable),decreasing=TRUE)[1:3] 
+1

sử dụng 'table (variable, useNA =" ifany ")' nếu bạn đang kiểm tra nếu 'NA' là giá trị thường xuyên nhất. nếu không 'NA' sẽ bị bỏ! – alexpghayes

2

bạn có thể sử dụng bảng() chức năng để có được một bảng về tần số của các giá trị trong một mảng/vector và sau đó sắp xếp cái bàn này.

x = c(1, 1, 1, 2, 2) 
sort(table(x)) 
2 1 
2 3 
8

Tôi không biết nếu điều này là tốt hơn so với phương pháp bảng, nhưng nếu danh sách của bạn đã là một yếu tố sau đó phương pháp tóm tắt của nó sẽ cung cấp cho bạn đếm tần số:

> summary(as.factor(c(1,1,1,1,1,1,2,3,4,5,7,7,5,7,7,7))) 
1 2 3 4 5 7 
6 1 1 1 2 5 

Và sau đó bạn có thể có được top 3 thường gặp nhất như sau:

> names(sort(summary(as.factor(c(1,1,1,1,1,1,2,3,4,5,7,7,5,7,7,7))), decreasing=T)[1:3]) 
[1] "1" "7" "5" 
7

Nếu vector của bạn chỉ chứa số nguyên, tabulate sẽ nhiều nhanh hơn còn gì nữa không. Có một vài sản lượng đánh bắt phải nhận thức được:

  • Nó sẽ theo mặc định trả lại số cho các số từ 1 đến N.
  • Nó sẽ trả về một vector giấu tên.

Điều đó có nghĩa là nếu x = c(1,1,1,3) của bạn sau đó sẽ trả lại (3, 0, 1). Lưu ý rằng số lượng được tính theo mặc định là 1 to max(x).

Làm cách nào bạn có thể sử dụng tabulate để đảm bảo rằng bạn có thể chuyển bất kỳ số nào?

set.seed(45) 
x <- sample(-5:5, 25, TRUE) 
# [1] 1 -2 -3 -1 -2 -2 -3 1 -3 -5 -1 4 -2 0 -1 -1 5 -4 -1 -3 -4 -2 1 2 4 

Chỉ cần thêm abs(min(x))+1 khi min(x) <= 0 để đảm bảo rằng các giá trị bắt đầu từ 1. Nếu min(x) > 0, sau đó chỉ cần sử dụng tabulate trực tiếp.

sort(setNames(tabulate(x + ifelse(min(x) <= 0, abs(min(x))+1, 0)), 
     seq(min(x), max(x))), decreasing=TRUE)[1:3] 

Nếu vector của bạn không chứa NA, sau đó bạn có thể sử dụng table với useNA="always" tham số.

Các vấn đề liên quan