Hi, I'm solve a problem where I want to select every 3rd row from a matrix. I do this for all rows in a loop. This gives me "i" matrices with different number of rows I want to stack these matrices in an array and fill the blanks with zero. Does anyone have any suggestions on how to go about this? So i want to go from [,1] [,2] [,3] [1,] 1 1 1 [2,] 2 2 2 [3,] 3 3 3 [4,] 4 4 4 [5,] 5 5 5 [6,] 6 6 6 [7,] 7 7 7 [8,] 8 8 8 [9,] 9 9 9 to , , 1 [,1] [,2] [,3] [1,] 1 1 1 [2,] 4 4 4 [3,] 7 7 7 , , 2 [,1] [,2] [,3] [1,] 2 2 2 [2,] 5 5 5 [3,] 8 8 8 , , 3 [,1] [,2] [,3] [1,] 3 3 3 [2,] 6 6 6 [3,] 9 9 9 , , 4 [,1] [,2] [,3] [1,] 4 4 4 [2,] 7 7 7 [3,] 0 0 0 ... , , 9 [,1] [,2] [,3] [1,] 9 9 9 [2,] 0 0 0 [3,] 0 0 0 Here's my go at it z <- array(c(1:9), c(9,3)) z1 <- array(0, c(3,3,9)) for(i in 1:9){ if(nrow(z[seq(i,9,3),]) == 2) z1[,,i] <- rbind(z[seq(i,9,3),],c(0,0,0)) else z1[,,i] <- z[seq(i,9,3),] } print(z1) I get the following error: Error in if (nrow(z[seq(i, 9, 3), ]) == 2) z1[, , i] <- rbind(z[seq(i, : argument is of length zero This is because nrow(z[seq(i, 9, 3) becomes NULL. Furthermore, this doesn't take care of the case where nrow(z[seq(i,9,3),]) ==1 Sorry for the long email and thank you in advance for reading it ;) Kristian [[alternative HTML version deleted]]
R. Michael Weylandt
2011-Sep-16 14:52 UTC
[R] Selecting from matrix and then stacking in array.
I think changing nrow() to NROW() will get around that error. However, this, as you can see, this goes a little astray at the end. Perhaps something like this will work for you: z.ext <- rbind(z,array(0,c(9,3))) z.out <- array(0, c(3,3,9)) for(i in 1:9){ z.out[,,i] <- cbind(z.ext[c(i,i+3,i+6),]) } print(z.out) Hope this helps, Michael Weylandt On Wed, Sep 14, 2011 at 3:42 PM, Kristian Lind < kristian.langgaard.lind@gmail.com> wrote:> Hi, > > I'm solve a problem where I want to select every 3rd row from a matrix. I > do > this for all rows in a loop. This gives me "i" matrices with different > number of rows > > I want to stack these matrices in an array and fill the blanks with zero. > > Does anyone have any suggestions on how to go about this? > > So i want to go from > > [,1] [,2] [,3] > [1,] 1 1 1 > [2,] 2 2 2 > [3,] 3 3 3 > [4,] 4 4 4 > [5,] 5 5 5 > [6,] 6 6 6 > [7,] 7 7 7 > [8,] 8 8 8 > [9,] 9 9 9 > > to > > , , 1 > > [,1] [,2] [,3] > [1,] 1 1 1 > [2,] 4 4 4 > [3,] 7 7 7 > > , , 2 > > [,1] [,2] [,3] > [1,] 2 2 2 > [2,] 5 5 5 > [3,] 8 8 8 > > , , 3 > > [,1] [,2] [,3] > [1,] 3 3 3 > [2,] 6 6 6 > [3,] 9 9 9 > > , , 4 > > [,1] [,2] [,3] > [1,] 4 4 4 > [2,] 7 7 7 > [3,] 0 0 0 > > ... > > , , 9 > > [,1] [,2] [,3] > [1,] 9 9 9 > [2,] 0 0 0 > [3,] 0 0 0 > > > Here's my go at it > > z <- array(c(1:9), c(9,3)) > z1 <- array(0, c(3,3,9)) > for(i in 1:9){ > if(nrow(z[seq(i,9,3),]) == 2) > z1[,,i] <- rbind(z[seq(i,9,3),],c(0,0,0)) > else > z1[,,i] <- z[seq(i,9,3),] > } > print(z1) > > I get the following error: Error in if (nrow(z[seq(i, 9, 3), ]) == 2) z1[, > , > i] <- rbind(z[seq(i, : > argument is of length zero > > This is because nrow(z[seq(i, 9, 3) becomes NULL. > Furthermore, this doesn't take care of the case where nrow(z[seq(i,9,3),]) > ==1 > > Sorry for the long email and thank you in advance for reading it ;) > > Kristian > > [[alternative HTML version deleted]] > > ______________________________________________ > R-help@r-project.org mailing list > https://stat.ethz.ch/mailman/listinfo/r-help > PLEASE do read the posting guide > http://www.R-project.org/posting-guide.html > and provide commented, minimal, self-contained, reproducible code. >[[alternative HTML version deleted]]