2016-05-29 18 views
7

Istnieje wiele pytań na temat wyodrębniania co n-tego elementu wektora, ale nie mogłem znaleźć sposobu na łatwe dodanie wartości po każdym n-tym elemencie wektor. Czy istnieje łatwy sposób dodania określonej wartości po każdym n-tym elemencie w wektorze?Dodawanie wartości po każdym n-tym elemencie wektora w R

Na przykład, powiedzmy, że mamy dwa wektory:

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" 

teraz chcę dodać elementy v2 po każdym trzecim elementem v1 począwszy od pierwszego. Wynik powinien wyglądać następująco:

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

Odpowiedz

7

Można przekształcić długi wektor w macierz o odpowiednich wymiarach; przykleić nagłówek na górze; a następnie użyj c(), aby spłaszczyć matrycę z powrotem do wektora. Przykładem

Construct:

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

Bądź matrycę i dołączyć nagłówek:

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"  

Teraz spłaszczyć go:

c(r) 
6

Możemy split z „V1” używając zmienną grupującą (utworzony z %/%) z wytworzeniem list, następnie złączyć (c) odpowiednie elementy „v2” z list przy użyciu Map i go.

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" 

Albo jeśli długość „V1” jest wielokrotnością liczby „3”, możemy stworzyć matrix z „v1”, cbind „v2”, transpozycji wyjście i konwertować matrix do vector z c.

c(t(cbind(v2,matrix(v1, ncol=3, byrow=TRUE)))) 
Powiązane problemy