Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

how to use a single vector to create a matrix with many columns

Tags:

r

Is there a faster way to take a vector and turn it into a 10 columns matrix, like in the following output?

I have a vector of 9000 elements and I am trying to create 200 columns, from the most recent observations to its previous 200 observations, going backward for each columns.

In the example below, the number 10 represent the 10th obs in the vector, the 9 represents the 9th obs,..., the number 1 represents the first observation in the vector.

     [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10]
 [1,]   10    9    8    7    6    5    4    3    2     1
 [2,]   11   10    9    8    7    6    5    4    3     2
 [3,]   12   11   10    9    8    7    6    5    4     3
 [4,]   13   12   11   10    9    8    7    6    5     4
 [5,]   14   13   12   11   10    9    8    7    6     5
 [6,]   15   14   13   12   11   10    9    8    7     6
 [7,]   16   15   14   13   12   11   10    9    8     7
 [8,]   17   16   15   14   13   12   11   10    9     8
 [9,]   18   17   16   15   14   13   12   11   10     9
[10,]   19   18   17   16   15   14   13   12   11    10
[11,]   20   19   18   17   16   15   14   13   12    11

    a<-1:20
    z<-cbind(
      a1<-a[-c(1:9)],
      a2<-a[-c(1:8,length(a))],
      a3<-a[-c(1:7,length(a)-1,length(a))],
      a4<-a[-c(1:6,(length(a)-2):length(a))],
      a5<-a[-c(1:5,(length(a)-3):length(a))],
      a6<-a[-c(1:4,(length(a)-4):length(a))],
      a7<-a[-c(1:3,(length(a)-5):length(a))],
      a8<-a[-c(1:2,(length(a)-6):length(a))],
      a9<-a[-c(1,(length(a)-7):length(a))],
      a10<-a[-c((length(a)-8):length(a))]
      )
    z

I did the same thing for 40 columns, but I can't imagine doing the same thing for 200 columns.

Any help would be greatly appreciated. Thank you in advance

a<-1:100
z<-cbind(
  a1<-a[-c(1:39)],
  a2<-a[-c(1:38,length(a))],
  a3<-a[-c(1:37,length(a)-1,length(a))],
  a4<-a[-c(1:36,(length(a)-2):length(a))],
  a5<-a[-c(1:35,(length(a)-3):length(a))],
  a6<-a[-c(1:34,(length(a)-4):length(a))],
  a7<-a[-c(1:33,(length(a)-5):length(a))],
  a8<-a[-c(1:32,(length(a)-6):length(a))],
  a9<-a[-c(1:31,(length(a)-7):length(a))],
  a10<-a[-c(1:30,(length(a)-8):length(a))],

  a11<-a[-c(1:29,(length(a)-9):length(a))],
  a12<-a[-c(1:28,(length(a)-10):length(a))],
  a13<-a[-c(1:27,(length(a)-11):length(a))],
  a14<-a[-c(1:26,(length(a)-12):length(a))],
  a15<-a[-c(1:25,(length(a)-13):length(a))],
  a16<-a[-c(1:24,(length(a)-14):length(a))],
  a17<-a[-c(1:23,(length(a)-15):length(a))],
  a18<-a[-c(1:22,(length(a)-16):length(a))],
  a19<-a[-c(1:21,(length(a)-17):length(a))],
  a20<-a[-c(1:20,(length(a)-18):length(a))],

  a21<-a[-c(1:19,(length(a)-19):length(a))],
  a22<-a[-c(1:18,(length(a)-20):length(a))],
  a23<-a[-c(1:17,(length(a)-21):length(a))],
  a24<-a[-c(1:16,(length(a)-22):length(a))],
  a25<-a[-c(1:15,(length(a)-23):length(a))],
  a26<-a[-c(1:14,(length(a)-24):length(a))],
  a27<-a[-c(1:13,(length(a)-25):length(a))],
  a28<-a[-c(1:12,(length(a)-26):length(a))],
  a29<-a[-c(1:11,(length(a)-27):length(a))],
  a30<-a[-c(1:10,(length(a)-28):length(a))],

  a31<-a[-c(1:9,(length(a)-29):length(a))],
  a32<-a[-c(1:8,(length(a)-30):length(a))],
  a33<-a[-c(1:7,(length(a)-31):length(a))],
  a34<-a[-c(1:6,(length(a)-32):length(a))],
  a35<-a[-c(1:5,(length(a)-33):length(a))],
  a36<-a[-c(1:4,(length(a)-34):length(a))],
  a37<-a[-c(1:3,(length(a)-35):length(a))],
  a38<-a[-c(1:2,(length(a)-36):length(a))],
  a39<-a[-c(1,(length(a)-37):length(a))],
  a40<-a[-c((length(a)-38):length(a))]
)
z
like image 621
user3602239 Avatar asked Dec 14 '22 21:12

user3602239


2 Answers

Here's one possibility:

m <- matrix(nrow=11, ncol=10)
ncol(m) - col(m) + row(m)
#       [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10]
#  [1,]   10    9    8    7    6    5    4    3    2     1
#  [2,]   11   10    9    8    7    6    5    4    3     2
#  [3,]   12   11   10    9    8    7    6    5    4     3
#  [4,]   13   12   11   10    9    8    7    6    5     4
#  [5,]   14   13   12   11   10    9    8    7    6     5
#  [6,]   15   14   13   12   11   10    9    8    7     6
#  [7,]   16   15   14   13   12   11   10    9    8     7
#  [8,]   17   16   15   14   13   12   11   10    9     8
#  [9,]   18   17   16   15   14   13   12   11   10     9
# [10,]   19   18   17   16   15   14   13   12   11    10
# [11,]   20   19   18   17   16   15   14   13   12    11
like image 51
Josh O'Brien Avatar answered May 24 '23 07:05

Josh O'Brien


I think embed() will be useful:

x <- 1:9000
m <- embed(x,200)
m <- m[,rev(seq(ncol(m)))]  ## reverse columns
like image 45
Ben Bolker Avatar answered May 24 '23 05:05

Ben Bolker