[R] Extract entries from matrix
Jorge I Velez
jorgeivanvelez at gmail.com
Tue Oct 27 22:38:44 CET 2015
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.
>
[[alternative HTML version deleted]]
More information about the R-help
mailing list