Chúng tôi muốn để có được một mảng trông như thế này:Lặp đi lặp lại một chuỗi lặp đi lặp lại
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
cách dễ nhất để làm điều đó là gì?
Chúng tôi muốn để có được một mảng trông như thế này:Lặp đi lặp lại một chuỗi lặp đi lặp lại
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
cách dễ nhất để làm điều đó là gì?
Bạn có thể làm điều đó với một rep
cuộc gọi duy nhất. Các tham số each
và times
đượ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
Đây phải là câu trả lời được chấp nhận, theo quan điểm của tôi – Andrie
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.
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
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)
Đâ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
nó nghĩ về vòng lặp for, nhưng không có cách nào đơn giản hơn? –