2015-01-03 11 views
6

Ho un vettore di numeri binari. Conosco la lunghezza consecutiva di ciascun gruppo di oggetti; come posso dividere in base a tali informazioni (senza ciclo for)?Dividere il vettore in base al vettore di lunghezze del blocco

x = c("1","0","1","0","0","0","0","0","1") 
.length = c(group1 = 2,group2=4, group3=3) 

x è il numero binario vettore che ho bisogno di dividere. .length è l'informazione che mi è stata data. .length essenzialmente mi dice che il primo gruppo ha 2 elementi e sono i primi due elementi 1,0. Il secondo gruppo ha gli elementi 4 e contiene i 4 numeri che seguono i numeri del gruppo 1, 1,0,0,0, ecc.

C'è un modo per dividerlo e restituire l'elemento suddiviso in un elenco?

Il modo brutto ha a che fare con un ciclo per tenere traccia dell'attuale cumsum, ma sto cercando un modo più elegante se ce n'è uno.

risposta

9

È possibile utilizzare rep per impostare la scissione dalla variabile, l'uso split

x = c("1","0","1","0","0","0","0","0","1") 
.length = c(group1 = 2,group2=4, group3=3) 

split(x, rep.int(seq_along(.length), .length)) 
# $`1` 
# [1] "1" "0" 
# 
# $`2` 
# [1] "1" "0" "0" "0" 
# 
# $`3` 
# [1] "0" "0" "1" 

Se si voleva prendere i nomi dei gruppi con voi per la lista di divisione, è possibile modificare rep di replicare i nomi

split(x, rep.int(names(.length), .length)) 
# $group1 
# [1] "1" "0" 
# 
# $group2 
# [1] "1" "0" "0" "0" 
# 
# $group3 
# [1] "0" "0" "1" 
1

Un'altra opzione è

split(x,cumsum(sequence(.length)==1)) 
#$`1` 
#[1] "1" "0" 

#$`2` 
#[1] "1" "0" "0" "0" 

#$`3` 
#[1] "0" "0" "1" 

per ottenere il group names

split(x, sub('.$', '', names(sequence(.length)))) 
#$group1 
#[1] "1" "0" 

#$group2 
#[1] "1" "0" "0" "0" 

#$group3 
#[1] "0" "0" "1" 
Problemi correlati