2016-05-29 23 views
7

Ci sono molte domande là fuori su come estrarre ogni ennesimo elemento di un vettore, ma non sono riuscito a trovare uno di come aggiungere facilmente un valore dopo ogni ennesimo elemento di un vettore. C'è un modo semplice per aggiungere un certo valore dopo ogni ennesimo elemento in un vettore?Aggiunta di valore dopo ogni ennesimo elemento del vettore in R

Per esempio, supponiamo di avere due vettori:

v1 <- paste0(letters[1:3], rep(1:5, each = 3)) 
> v1 
[1] "a1" "b1" "c1" "a2" "b2" "c2" "a3" "b3" "c3" "a4" "b4" "c4" "a5" "b5" "c5" 

v2 <- paste0("header", seq(1:5)) 
> v2 
[1] "header1" "header2" "header3" "header4" "header5" 

Ora voglio aggiungere gli elementi di v2 dopo ogni terzo elemento di v1 a partire dal primo. Il risultato dovrebbe essere simile:

[1] "header1" "a1" "b1" "c1" "header2" "a2" "b2" "c2" "header3" "a3" "b3" "c3" "header4" "a4" "b4" "c4" "header5" "a5" "b5" "c5" 

risposta

7

È possibile rendere il vettore lungo in una matrice con le dimensioni appropriate; attaccare l'intestazione in cima; e quindi utilizzare c() per appiattire la matrice in un vettore.

Construct esempio:

v1 <- paste0(letters[1:3], rep(1:5, each = 3)) 
v2 <- paste0("header", seq(1:5)) 

Fai la matrice e allegare l'intestazione:

r <- rbind(v2,matrix(v1,ncol=length(v2))) 
## "header1" "header2" "header3" "header4" "header5" 
## "a1"  "a2"  "a3"  "a4"  "a5"  
## "b1"  "b2"  "b3"  "b4"  "b5"  
## "c1"  "c2"  "c3"  "c4"  "c5"  

Ora appiattirla:

c(r) 
6

Possiamo split il 'v1' utilizzando una variabile di raggruppamento (creato con %/%) per formare una list, poi concatena (c) i corrispondenti elementi 'v2' con il list utilizzando Map e unlist it.

unlist(Map(`c`, v2, split(v1, (seq_along(v1)-1)%/%3+1)), use.names=FALSE) 
#[1] "header1" "a1"  "b1"  "c1"  "header2" "a2"  "b2"  
#[8] "c2"  "header3" "a3"  "b3"  "c3"  "header4" "a4"  
#[15] "b4"  "c4"  "header5" "a5"  "b5"  "c5" 

Oppure, se la lunghezza del 'v1' è un multiplo di '3', possiamo creare un matrix con 'v1', cbind 'v2', trasporre l'output e convertire il matrix per vector con c.