Crea nomi di gruppo per valori consecutivi

Sembra un compito facile, non riesco a capire un modo più semplice. Ho un vettore x sotto, e ho bisogno di creare nomi di gruppo per valori consecutivi. Il mio tentativo stava usando idee migliori e migliori?

 # data x <- c(1,1,1,2,2,2,3,2,2,1,1) # make groups rep(paste0("Group_", 1:length(rle(x)$lengths)), rle(x)$lengths) # [1] "Group_1" "Group_1" "Group_1" "Group_2" "Group_2" "Group_2" "Group_3" "Group_4" # [9] "Group_4" "Group_5" "Group_5" 

Usando diff e cumsum :

 paste0("Group_", cumsum(c(1, diff(x) != 0))) #[1] "Group_1" "Group_1" "Group_1" "Group_2" "Group_2" "Group_2" "Group_3" "Group_4" "Group_4" "Group_5" "Group_5" 

(Se i tuoi valori sono valori in virgola mobile, dovresti evitare != E usare invece una tolleranza.)

Usando rleid da data.table ,

 library(data.table) paste0('Group_', rleid(x)) #[1] "Group_1" "Group_1" "Group_1" "Group_2" "Group_2" "Group_2" "Group_3" "Group_4" "Group_4" "Group_5" "Group_5" 

Usare cumsum ma non fare affidamento sul fatto che i dati siano numerici:

 paste0("Group_", 1 + c(0, cumsum(x[-length(x)] != x[-1]))) [1] "Group_1" "Group_1" "Group_1" "Group_2" "Group_2" "Group_2" "Group_3" "Group_4" "Group_4" "Group_5" "Group_5"