2009-10-01 8 views
40

W R, jaki byłby najskuteczniejszy/najprostszy sposób zliczania przebiegów identycznych elementów w sekwencji?Jak mogę policzyć biegi w sekwencji?

Jak na przykład do zliczania liczby kolejnych jedynek w sekwencji nieujemne liczby całkowite:

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

Czy chcesz odpowiedzi w R? Jeśli tak, prawdopodobnie rozsądniej jest rozpocząć pytanie od "In R ..." niż po prostu oznaczenie R. – slim

+0

Uwaga: to nie działa z seriami NA lub NaN (zawsze traktowane są jako nieciągłe). Brzydkim obejściem hack byłoby przypisanie NA i NaN do niektórych warto- ściowych wartości całkowitych. – smci

Odpowiedz

62

Użyj RLE():

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

A jak wykreślić histogram z tych danych? Wyobraź sobie, że mam liczby od 1 do 100 i squences o różnych długościach. I chcę utworzyć histogram pokazujący, jak często zdarzają się odcinki o pewnej długości, czy dzieje się liczba lub obie rzeczy. – skan

+4

To nie jest miejsce na nowe pytanie. –

20

To może być wykonane w sposób skuteczny sposób za pomocą indeksów w których wartości zmieniają:

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

znaleźć gdzie zmienić wartości:

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

Get indeksy, a następnie uzyskać różnicę w kolejnych indeksów:

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

Zasadniczo to robi rle(). –

+1

Przepraszam, Rob. Napisałem to na moim iPhonie wcześniej i nie ma "aplikacji do tego". :). Głosuj na odpowiedź Roba zamiast na moją! – Shane

+5

+1: Podczas gdy 'rle()' jest łatwiejszym sposobem na odpowiedź na pytanie OP, to rozwiązanie ma inne zalety w niektórych przypadkach. W szczególności szukałem sposobu numerowania poszczególnych przebiegów, a nie liczenia przebiegów i stwierdziłem, że mogę to zrobić za pomocą 'c (0, cumsum (x [-1L]! = X [-length (x)])) '. – Simon

Powiązane problemy