2009-10-01 57 views
40

Trong R, điều gì sẽ là cách hiệu quả nhất/đơn giản nhất để đếm số lần chạy các phần tử giống nhau trong một chuỗi?Làm cách nào để đếm số lần chạy theo chuỗi?

Ví dụ, làm thế nào để đếm số lượng số không liên tiếp trong một chuỗi các số nguyên không âm:

x <- c(1,0,0,0,1,0,0,0,0,0,2,0,0) # should give 3,5,2 
+0

Bạn có muốn câu trả lời trong R? Nếu vậy, có thể là khôn ngoan khi bắt đầu câu hỏi bằng "In R ..." thay vì chỉ có thẻ R. – slim

+0

Lưu ý: điều này không hoạt động với các lần chạy NA hoặc NaN (chúng luôn được coi là không tiếp giáp). Một giải pháp hack xấu xí sẽ là gán NA và NaN cho một số giá trị số nguyên sentinel. – smci

Trả lời

62

Sử dụng RLE():

y <- rle(c(1,0,0,0,1,0,0,0,0,0,2,0,0)) 
y$lengths[y$values==0] 
+0

Và bạn sẽ vẽ biểu đồ từ dữ liệu này như thế nào? Hãy tưởng tượng tôi có các số từ 1 đến 100 và các độ dài khác nhau. Và tôi muốn tạo biểu đồ cho thấy tần suất chạy của một số độ dài xảy ra xảy ra hoặc số xảy ra hoặc cả hai thứ. – skan

+4

Đây không phải là nơi dành cho một câu hỏi mới. –

20

này có thể được thực hiện trong một hiệu quả cách sử dụng chỉ mục nơi giá trị thay đổi:

x <- c(1,0,0,0,1,2,1,0,0,1,1) 

Tìm nơi giá trị thay đổi:

diffs <- x[-1L] != x[-length(x)] 

Lấy chỉ số, và sau đó nhận được sự khác biệt về chỉ số sau:

idx <- c(which(diffs), length(x)) 
diff(c(0, idx)) 
+0

Đó chính là những gì rle() đang làm. –

+1

Xin lỗi Rob. Đã viết rằng trên iPhone của tôi trước đó, và không có "ứng dụng cho điều đó". :). Hãy bình chọn cho câu trả lời của Rob thay cho tôi! – Shane

+5

+1: Trong khi 'rle()' là một cách dễ dàng hơn để trả lời câu hỏi của OP, giải pháp này có lợi thế khác cho một số trường hợp. Đặc biệt, tôi đang tìm cách để đánh số lần chạy duy nhất thay vì đếm số lần chạy và tôi thấy tôi có thể làm điều đó với 'c (0, cumsum (x [-1L]! = X [-length (x)])) '. – Simon

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