Oznaczanie ciągłych fragmentów obserwacji bez pętli for

Mam standardowy problem „nie mogę uniknąć pętli”, ale nie mogę znaleźć rozwiązania.

Odpowiedziałemto pytanie przez @splaisan ale musiałem uciekać się do jakichś brzydkich wykrzywień w środkowej części, za pomocąfor i wieleif testy. Symuluję prostszą wersję tutaj, mając nadzieję, że ktoś może dać lepszą odpowiedź ...

PROBLEM

Biorąc pod uwagę taką strukturę danych:

df <- read.table(text = 'type
a
a
a
b
b
c
c
c
c
d
e', header = TRUE)

Chcę zidentyfikować ciągłe fragmenty tego samego typu i oznaczyć je grupami. Pierwszy fragment powinien być oznaczony jako 0, następny 1 i tak dalej. Istnieje nieokreślona liczba porcji, a każda porcja może być tak krótka, jak tylko jeden członek.

type    label
   a    0
   a    0
   a    0
   b    1
   b    1
   c    2
   c    2
   c    2
   c    2
   d    3
   e    4

MOJE ROZWIĄZANIE

Musiałem uciekać się dofor Aby to zrobić, oto kod:

label <- 0
df$label <- label

# LOOP through the label column and increment the label
# whenever a new type is found
for (i in 2:length(df$type)) {
    if (df$type[i-1] != df$type[i]) { label <- label + 1 }
    df$label[i] <- label
}

MOJE PYTANIE

Czy każdy może to zrobić bez pętli i warunków?

questionAnswers(3)

yourAnswerToTheQuestion