[R] Extract entries from matrix

Jorge I Velez jorgeivanvelez at gmail.com
Wed Nov 4 18:19:01 CET 2015


Dear Dr. Steipe,

Thank you for the code.  It does exactly what I needed.

Best regards,
Jorge.-


On Wed, Oct 28, 2015 at 1:18 PM, Boris Steipe <boris.steipe at utoronto.ca>
wrote:

> Your code does not produce the matrix in your image.
> The first three rows contain all-zeros and the last row is missing.
> The following line fixes that:
>
> m <- rbind(m[-(1:3), ], 1:5)
>
> Given that matrix, the following code produces the output
> you have illustrated. It's so trivial however that I suspect
> something must be missing in your problem description.
>
>
>
> v <- numeric(nrow(m))
> j <- 1
> for (i in 1:nrow(m)) {
>     if (j > ncol(m) || m[i,j] == 0) {
>         j <- 1
>     }
>     v[i] <- m[i,j]
>     j <- j+1
> }
>
> v
>
> Note that this puts 0 in the output if
> there is a zero in your first column and
> the "diagonal". Your example didn't have that.
>
>
>
> B.
>
>
> On Oct 28, 2015, at 1:17 PM, Jorge I Velez <jorgeivanvelez at gmail.com>
> wrote:
>
> > Dear all,
> >
> > I thought I would better send an image illustrating that the problem is
> > (hope the file gets through).  In the picture, the matrix "m" is given by
> >
> > ## input
> > m <- structure(c(0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 2, 2,
> > 2, 2, 2, 2, 2, 2, 2, 0, 0, 0, 3, 3, 3, 3, 3, 3, 3, 3, 3, 0, 0,
> > 0, 0, 0, 0, 0, 0, 4, 4, 4, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5,
> > 5), .Dim = c(12L, 5L))
> >
> > We start from the entry [1,1] and select all values in the diagonal until
> > we find the first zero. That is, we select the values in purple.  Because
> > the first zero is found in [4,4], the next matrix begins in the 4th row.
> > The values of interest would be 1, 2, 3, 4, 5 (light blue).  The last
> value
> > in this resulting vector is entry m[8,5], which is located at the maximum
> > number of columns of m. Hence, the next matrix to work with starts at
> row 9
> > and the values of interest are 1, 2 (in orange).
> >
> > The output vector would then be of the same length as the number of rows
> in
> > "m", and would contain the elements previously selected.
> >
> > Any ideas on how to proceed?
> >
> > Thank you very much in advance.
> >
> > Best regards,
> > Jorge Velez.-
> >
> >
> >
> > On Tue, Oct 27, 2015 at 4:38 PM, Jorge I Velez <jorgeivanvelez at gmail.com
> >
> > wrote:
> >
> >> Thank you all for your solutions and comments.
> >>
> >> As Dr. Carlson mentioned, we leave rows 1 to 3 out as they are all
> zeroes.
> >> Then, the entries I need to select from m are
> >>
> >> ----------------
> >> entry     value
> >> ----------------
> >> 4,1  ---> 1
> >> 5,2  ---> 2
> >> 6,3  ---> 3
> >> 7,1  ---> 1
> >> 8,2  ---> 2
> >> 9,3  ---> 3
> >> 10,4  ---> 4
> >> 11,5  ---> 5
> >> 12,1  ---> 1
> >>
> >> Note that the entry [7,4] is zero, so we start from the first column in
> >> the 7th row and then select entry [7,1] instead.  That's what I meant
> by  "...
> >> the idea is to extract the diagonal elements until a zero is found."  I
> >> should have said *entries* instead of  _diagonal elements_. I am sorry
> Dr.
> >> Turner for the confusion.
> >>
> >> Starting with m
> >>
> >> R> m
> >> #       [,1] [,2] [,3] [,4] [,5]
> >> # [1,]    0    0    0    0    0
> >> # [2,]    0    0    0    0    0
> >> # [3,]    0    0    0    0    0
> >> # [4,]    1    2    3    0    0
> >> # [5,]    1    2    3    0    0
> >> # [6,]    1    2    3    0    0
> >> # [7,]    1    2    3    0    0
> >> # [8,]    1    2    3    0    0
> >> # [9,]    1    2    3    4    0
> >> #[10,]    1    2    3    4    0
> >> #[11,]    1    2    3    4    5
> >> #[12,]    1    2    3    4    5
> >>
> >> the first submatrix to work with is
> >>
> >> # [4,]    1    2    3    0    0
> >> # [5,]    1    2    3    0    0
> >> # [6,]    1    2    3    0    0
> >>
> >> from which the elements of interest are 1, 2, 3.  Note that the 7th row
> of
> >> m is not included here because m[7, 5] = 0.
> >>
> >> Further, the second submatrix is
> >>
> >> # [7,]    1    2    3    0    0
> >> # [8,]    1    2    3    0    0
> >> # [9,]    1    2    3    4    0
> >> #[10,]    1    2    3    4    0
> >> #[11,]    1    2    3    4    5
> >>
> >> and the corresponding elements are 1, 2, 3, 4, 5.
> >>
> >> And the last matrix is
> >>
> >> #[12,]    1    2    3    4    5
> >>
> >> from which the position [12,1] is selected.
> >>
> >> So, the resulting entries from this process are 1, 2, 3, 1, 2, 3, 4, 5,
> 1.
> >>
> >> Thank you in advance for any additional insight you may provide.
> >>
> >> Regards,
> >> Jorge Velez.-
> >>
> >>
> >>
> >> On Tue, Oct 27, 2015 at 4:06 PM, David L Carlson <dcarlson at tamu.edu>
> >> wrote:
> >>
> >>> I don't see how you are getting the result you provide.
> >>>
> >>>> m
> >>>      [,1] [,2] [,3] [,4] [,5]
> >>> [1,]    0    0    0    0    0
> >>> [2,]    0    0    0    0    0
> >>> [3,]    0    0    0    0    0
> >>> [4,]    1    2    3    0    0
> >>> [5,]    1    2    3    0    0
> >>> [6,]    1    2    3    0    0
> >>> [7,]    1    2    3    0    0
> >>> [8,]    1    2    3    0    0
> >>> [9,]    1    2    3    4    0
> >>> [10,]    1    2    3    4    0
> >>> [11,]    1    2    3    4    5
> >>> [12,]    1    2    3    4    5
> >>>> t(sapply(1:8, function(x) diag(m[x:12, ])))
> >>>     [,1] [,2] [,3] [,4] [,5]
> >>> [1,]    0    0    0    0    0
> >>> [2,]    0    0    3    0    0
> >>> [3,]    0    2    3    0    0
> >>> [4,]    1    2    3    0    0
> >>> [5,]    1    2    3    0    0
> >>> [6,]    1    2    3    4    0
> >>> [7,]    1    2    3    4    5
> >>> [8,]    1    2    3    4    5
> >>>
> >>> These are all of the diagonals from the 1st through 8th rows. The
> first 3
> >>> begin with 0 so we leave them out, but then we have 4th: 1, 2, 3; 5th:
> 1,
> >>> 2, 3; 6th: 1, 2, 3, 4, etc so you must have some additional rule in
> mind to
> >>> get your answer.
> >>>
> >>> -------------------------------------
> >>> David L Carlson
> >>> Department of Anthropology
> >>> Texas A&M University
> >>> College Station, TX 77840-4352
> >>>
> >>>
> >>>
> >>> -----Original Message-----
> >>> From: R-help [mailto:r-help-bounces at r-project.org] On Behalf Of Jorge
> I
> >>> Velez
> >>> Sent: Tuesday, October 27, 2015 2:44 PM
> >>> To: jim holtman
> >>> Cc: R-help
> >>> Subject: Re: [R] Extract entries from matrix
> >>>
> >>> Dear Jim,
> >>>
> >>> Thank you very much for your quick reply.
> >>>
> >>> I am sorry for the confusion it may have caused, but I messed up the
> >>> indexes in my example.  I would like, from the following matrix "m"
> >>>
> >>> ## input
> >>> m <- structure(c(0L, 0L, 0L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 0L,
> >>> 0L, 0L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 0L, 0L, 0L, 3L, 3L,
> >>> 3L, 3L, 3L, 3L, 3L, 3L, 3L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 4L,
> >>> 4L, 4L, 4L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 5L, 5L), .Dim =
> c(12L,
> >>> 5L))
> >>>
> >>> to obtain
> >>>
> >>> 1 2 3 1 2 3 4 5 1
> >>>
> >>> Sure using m[idx] will give the desired result.  The problem is that
> idx
> >>> is
> >>> not known and needs to be determined from "m".  I would like to use
> >>> something like
> >>>
> >>> extractDiagonals(m)
> >>> ## [1]  1 2 3 1 2 3 4 5 1
> >>>
> >>> I look forward to your reply.  Thanks in advance.
> >>>
> >>> Best regards,
> >>> Jorge Velez.-
> >>>
> >>>
> >>>
> >>> On Tue, Oct 27, 2015 at 2:31 PM, jim holtman <jholtman at gmail.com>
> wrote:
> >>>
> >>>> If you want to use the numbers you gave a the index into the matrix,
> >>> then
> >>>> you can create a matrix with the values and then index into 'm'.  I
> >>> don't
> >>>> see a '4' in the output example you gave using your index values:
> >>>>
> >>>>> m <- structure(c(0L, 0L, 0L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L,
> >>>> +  1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 0L, 0L, 0L, 2L, 2L, 2L, 2L,
> >>>> +  2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 0L,
> >>>> +  0L, 0L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L,
> >>>> +  3L, 3L, 3L, 3L, 3L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 4L, 4L, 4L,
> >>>> +  4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 0L, 0L, 0L, 0L, 0L,
> >>>> +  0L, 0L, 0L, 0L, 0L, 5L, 5L, 5L, 5L, 5L, 5L, 5L, 5L, 5L, 5L, 5L,
> >>>> +  5L), .Dim = c(22L, 5L))
> >>>>> # create index matrix
> >>>>> indx <- matrix(c(4, 1,
> >>>> +  5, 2,
> >>>> +  6, 3,
> >>>> +  7, 1,
> >>>> +  8, 2,
> >>>> +  9, 3,
> >>>> +  10, 1,
> >>>> +  11, 2,
> >>>> +  12, 3), ncol = 2, byrow = TRUE)
> >>>>>
> >>>>>
> >>>>> m
> >>>>      [,1] [,2] [,3] [,4] [,5]
> >>>> [1,]    0    0    0    0    0
> >>>> [2,]    0    0    0    0    0
> >>>> [3,]    0    0    0    0    0
> >>>> [4,]    1    2    3    0    0
> >>>> [5,]    1    2    3    0    0
> >>>> [6,]    1    2    3    0    0
> >>>> [7,]    1    2    3    0    0
> >>>> [8,]    1    2    3    0    0
> >>>> [9,]    1    2    3    4    0
> >>>> [10,]    1    2    3    4    0
> >>>> [11,]    1    2    3    4    5
> >>>> [12,]    1    2    3    4    5
> >>>> [13,]    1    2    3    4    5
> >>>> [14,]    1    2    3    4    5
> >>>> [15,]    1    2    3    4    5
> >>>> [16,]    1    2    3    4    5
> >>>> [17,]    1    2    3    4    5
> >>>> [18,]    1    2    3    4    5
> >>>> [19,]    1    2    3    4    5
> >>>> [20,]    1    2    3    4    5
> >>>> [21,]    1    2    3    4    5
> >>>> [22,]    1    2    3    4    5
> >>>>> indx
> >>>>      [,1] [,2]
> >>>> [1,]    4    1
> >>>> [2,]    5    2
> >>>> [3,]    6    3
> >>>> [4,]    7    1
> >>>> [5,]    8    2
> >>>> [6,]    9    3
> >>>> [7,]   10    1
> >>>> [8,]   11    2
> >>>> [9,]   12    3
> >>>>> m[indx]
> >>>> [1] 1 2 3 1 2 3 1 2 3
> >>>>
> >>>>
> >>>> Jim Holtman
> >>>> Data Munger Guru
> >>>>
> >>>> What is the problem that you are trying to solve?
> >>>> Tell me what you want to do, not how you want to do it.
> >>>>
> >>>> On Tue, Oct 27, 2015 at 2:43 PM, Jorge I Velez <
> >>> jorgeivanvelez at gmail.com>
> >>>> wrote:
> >>>>
> >>>>> Dear R-help,
> >>>>>
> >>>>> I am working with a matrix "m" from which I would like to extract
> some
> >>>>> elements.  An toy example is as follows:
> >>>>>
> >>>>> ## input matrix
> >>>>> m <- structure(c(0L, 0L, 0L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L,
> >>>>> 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 0L, 0L, 0L, 2L, 2L, 2L, 2L,
> >>>>> 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 0L,
> >>>>> 0L, 0L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L,
> >>>>> 3L, 3L, 3L, 3L, 3L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 4L, 4L, 4L,
> >>>>> 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 4L, 0L, 0L, 0L, 0L, 0L,
> >>>>> 0L, 0L, 0L, 0L, 0L, 5L, 5L, 5L, 5L, 5L, 5L, 5L, 5L, 5L, 5L, 5L,
> >>>>> 5L), .Dim = c(22L, 5L))
> >>>>>
> >>>>> R> m
> >>>>> #         [,1]  [,2] [,3] [,4] [,5]
> >>>>> #  [1,]    0    0    0    0    0
> >>>>> #  [2,]    0    0    0    0    0
> >>>>> #  [3,]    0    0    0    0    0
> >>>>> #  [4,]    1    2    3    0    0
> >>>>> #  [5,]    1    2    3    0    0
> >>>>> #  [6,]    1    2    3    0    0
> >>>>> #  [7,]    1    2    3    0    0
> >>>>> #  [8,]    1    2    3    0    0
> >>>>> #  [9,]    1    2    3    4    0
> >>>>> # [10,]   1    2    3    4    0
> >>>>> # [11,]   1    2    3    4    5
> >>>>> # [12,]   1    2    3    4    5
> >>>>>
> >>>>>> From "m", I would like to extract the entries
> >>>>>
> >>>>> 4, 1
> >>>>> 5, 2
> >>>>> 6, 3
> >>>>> 7, 1
> >>>>> 8, 2
> >>>>> 9, 3
> >>>>> 10, 1
> >>>>> 11, 2
> >>>>> 12, 3
> >>>>>
> >>>>> so at the end of applying a function "f" to "m" I get
> >>>>>
> >>>>> 1, 2, 3, 1, 2, 3, 4, 1, 2, 3
> >>>>>
> >>>>>
> >>>>> Basically the idea is to extract the diagonal elements until a zero
> is
> >>>>> found.
> >>>>>
> >>>>> In the real problem the dimensions of "m" are much bigger, but this
> >>>>> smaller
> >>>>> version of "m" illustrate what needs to be done.
> >>>>>
> >>>>> I would greatly appreciate any ideas on how to do this.
> >>>>>
> >>>>> Thanks in advance,
> >>>>> Jorge Velez.-
> >>>>>
> >>>>>        [[alternative HTML version deleted]]
> >>>>>
> >>>>> ______________________________________________
> >>>>> R-help at r-project.org mailing list -- To UNSUBSCRIBE and more, see
> >>>>> 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]]
> >>>
> >>> ______________________________________________
> >>> R-help at r-project.org mailing list -- To UNSUBSCRIBE and more, see
> >>> 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.
> >>>
> >>
> >>
> > <example.png>______________________________________________
> > R-help at r-project.org mailing list -- To UNSUBSCRIBE and more, see
> > 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]]



More information about the R-help mailing list