just a quick question I am struggling in R to convert a list of numbers to a matrix that has a fixed number of rows and the numbers are placed in triplets (blocks of 3 rows) at a time The elements are numbers but I will just show the position where I want them to be placed.
e.g. for 3 rows
1 2 3 10 11 12
4 5 6 13 14 15
7 8 9 16 17 18
for 4 rows
1 2 3 13 14 15
4 5 6 16 17 18
7 8 9 19 20 21
10 11 12 22 23 24
3 rows:
1 2 3 10 11 12 19 20 21 28 29 30
4 5 6 13 14 15 22 23 24 31 32 33
7 8 9 16 17 18 25 26 27 34 35 36
Thanks!
tried many different ways and packages but no luck
Use gl to create a vector consisting of 1,1,1,2,2,2, etc. up to nr,nr,nr (where nr is the desired number of rows). split will repeat it to the length of the input so split the input by that and rbind the resulting list components together. No packages are used.
f <- function(x, nr) do.call("rbind", split(x, gl(nr, 3)))
# tests
f(1:18, 3)
## [,1] [,2] [,3] [,4] [,5] [,6]
## 1 1 2 3 10 11 12
## 2 4 5 6 13 14 15
## 3 7 8 9 16 17 18
f(1:24, 4)
## [,1] [,2] [,3] [,4] [,5] [,6]
## 1 1 2 3 13 14 15
## 2 4 5 6 16 17 18
## 3 7 8 9 19 20 21
## 4 10 11 12 22 23 24
f(1:36, 3)
## [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10] [,11] [,12]
## 1 1 2 3 10 11 12 19 20 21 28 29 30
## 2 4 5 6 13 14 15 22 23 24 31 32 33
## 3 7 8 9 16 17 18 25 26 27 34 35 36
This variation also works:
f2 <- function(x, nr) t(simplify2array(split(x, gl(nr, 3))))
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With