2012-06-24 12 views
10

Chcemy dostać tablicę, która wygląda tak:Powtarzanie powtarzana sekwencja

1,1,1,2,2,2,3,3,3,4,4,4,1,1,1,2,2,2,3,3,3,4,4,4,1,1,1,2,2,2,3,3,3,4,4,4 

Jaki jest najprostszy sposób to zrobić?

+0

pomyślał o pętli for, ale czy nie jest prostszy sposób? –

Odpowiedz

30

Można to zrobić za pomocą jednego rep rozmowy. Parametry each i times są oceniane sekwencyjnie, przy czym najpierw wykonuje się each.

rep(1:4, times=3, each=3) 
#[1] 1 1 1 2 2 2 3 3 3 4 4 4 1 1 1 2 2 2 3 3 3 4 4 4 1 1 1 2 2 2 3 3 3 4 4 4 
+1

To powinna być akceptowana odpowiedź, według mnie – Andrie

2

jak poniżej:

rep(sapply(1:4, function(x) {rep(x, 3)}), 3) 

REP (X, Y) zwraca wektor powtarzania razy x n. sapply stosuje daną funkcję do każdego elementu wektora 1: 4 oddzielnie, powtarzając każdy element 3 razy pod rząd.

+3

Powinieneś rzucić okiem na odpowiedź Dietera - parametr "każdy" zrobiłby to, co robisz, o wiele ładniej niż przy użyciu połączenia z sapply. – Dason

17

Albo prościej (zakładając, że masz na myśli wektor, a nie tablicy)

rep(rep(1:4,each=3),3) 
0

Oto metoda wykorzystująca manipulację tablicą przy pomocy aperm. Chodzi o to, aby skonstruować tablicę zawierającą wartości. Zmień ich rozmieszczenie tak, aby pasowały do ​​żądanego wyjścia, używając aperm, a następnie "rozwiń" tablicę za pomocą c.

c(aperm(array(1:4, dim=c(4,3,3)), c(2, 1, 3))) 
[1] 1 1 1 2 2 2 3 3 3 4 4 4 1 1 1 2 2 2 3 3 3 4 4 4 1 1 1 2 2 2 3 3 3 4 4 4