2012-05-17 56 views
7

Nếu tôi có một vector nhưĐếm số liên tiếp trong một vector

"a": 0 0 0 1 1 1 0 0 0 0 1 1 0 0 0 

Tôi muốn biết có bao nhiêu 1 ở bên nhau trong a, trong trường hợp này là câu trả lời sẽ là 3 và 2.

Is có bất kỳ kịch bản có thể làm điều này?

+6

Tôi đã nhìn thấy ít nhất 3 câu hỏi trong 2 ngày kể từ khi những người tìm kiếm cho 'rle' nó là một chức năng che khuất nhưng rất tiện dụng. –

Trả lời

17

Xem ?rle.

## create example vector 
a <- c(rep(0, 3), rep(1, 3), rep(0, 4), rep(1, 2), rep(0, 3)) 

## count continuous values 
r <- rle(a) 

## fetch continuous length for value 1 
r$lengths[r$values == 1] 
# [1] 3 2 
+0

Không phải là 'giá trị' và không phải' giá trị'? Kết hợp từng phần với '$' tìm thông tin đúng, nhưng như vậy sẽ 'rle (a) $ v' đưa nó đến mức cực đoan. – thelatemail

7

Làm thế nào về điều này?

test <- c(0,0,0,1,1,1,0,0,0,0,1,1,0,0,0) 
rle(test)$lengths[rle(test)$values==1] 
#[1] 3 2 

Đối với dữ liệu lớn, bạn có thể tăng tốc độ nó lên một chút sử dụng một số lựa chọn phức tạp:

diff(unique(cumsum(test == 1)[test != 1])) 
#[1] 3 2 
5

Những người khác đã trả lời câu hỏi. Tôi chỉ muốn thêm hai quan sát:

Bí quyết nhập dữ liệu: sử dụng quét (mặc định cho lớp "số", không cần đại diện hoặc dấu phẩy) và nó cũng hoạt động cho các ký tự được phân tách bằng khoảng trắng nếu bạn thêm "ký tự" một cuộc tranh cãi.

a <- scan() 
1: 0 0 0 1 1 1 0 0 0 0 1 1 0 0 0 
16: 
Read 15 items 

rle thực sự là hàm nghịch đảo cho rep

arle <- rle(a) 
rep(arle$values, arle$lengths) 
[1] 0 0 0 1 1 1 0 0 0 0 1 1 0 0 0 
+1

Tôi nghĩ rle là hàm nghịch đảo đối với nghịch đảo.rle;) – Dason

+1

Vâng, tôi giả sử, nhưng bạn đã xem mã của nó chưa? –

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