2012-06-24 24 views

Trả lời

30

Bạn có thể làm điều đó với một rep cuộc gọi duy nhất. Các tham số eachtimes được đánh giá tuần tự với số each được thực hiện trước.

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

Đây phải là câu trả lời được chấp nhận, theo quan điểm của tôi – Andrie

2

Như thế này:

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

đại diện (x, N) trả về một vector lặp lại lần x N. áp dụng hàm cho sẵn cho từng phần tử của vector 1: 4 một cách riêng biệt, lặp lại mỗi phần tử 3 lần liên tiếp.

+3

Bạn nên xem xét câu trả lời của Dieter - thông số 'mỗi' sẽ làm những gì bạn đang làm đẹp hơn rất nhiều so với sử dụng một cuộc gọi đến một cách dễ dàng. – Dason

17

Hoặc, đơn giản hơn (giả sử bạn có nghĩa là một véc tơ, không phải là một mảng)

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

Đây là phương pháp sử dụng thao tác mảng với aperm. Ý tưởng là xây dựng một mảng chứa các giá trị. Sắp xếp lại chúng sao cho chúng khớp với đầu ra mong muốn bằng cách sử dụng aperm và sau đó "mở ra" mảng với 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