[R] Identify row indices corresponding to each distinct row of a matrix

Bert Gunter bgunter@4567 @ending from gm@il@com
Thu Nov 8 16:42:56 CET 2018


Yes -- much better than mine. I didn't know about the MARGIN argument of
duplicated().

-- Bert


On Wed, Nov 7, 2018 at 10:32 PM Jeff Newmiller <jdnewmil using dcn.davis.ca.us>
wrote:

> Perhaps
>
> which( ! duplicated( m, MARGIN=1 ) )
>
> ? (untested)
>
> On November 7, 2018 9:20:57 PM PST, Bert Gunter <bgunter.4567 using gmail.com>
> wrote:
> >A mess -- due to your continued use of html formatting.
> >
> >But something like this may do what you want (hard to tell with the
> >mess):
> >
> >> m <- matrix(1:16,nrow=8)[rep(1:8,2),]
> >> m
> >      [,1] [,2]
> > [1,]    1    9
> > [2,]    2   10
> > [3,]    3   11
> > [4,]    4   12
> > [5,]    5   13
> > [6,]    6   14
> > [7,]    7   15
> > [8,]    8   16
> > [9,]    1    9
> >[10,]    2   10
> >[11,]    3   11
> >[12,]    4   12
> >[13,]    5   13
> >[14,]    6   14
> >[15,]    7   15
> >[16,]    8   16
> >> vec <- apply(m,1,paste,collapse="-") ## converts rows into character
> >vector
> >> vec
> >[1] "1-9"  "2-10" "3-11" "4-12" "5-13" "6-14" "7-15" "8-16" "1-9"
> >"2-10"
> >"3-11" "4-12" "5-13" "6-14"
> >[15] "7-15" "8-16"
> >> ## Then maybe:
> >> tapply(seq_along(vec),vec, I)
> >$`1-9`
> >[1] 1 9
> >
> >$`2-10`
> >[1]  2 10
> >
> >$`3-11`
> >[1]  3 11
> >
> >$`4-12`
> >[1]  4 12
> >
> >$`5-13`
> >[1]  5 13
> >
> >$`6-14`
> >[1]  6 14
> >
> >$`7-15`
> >[1]  7 15
> >
> >$`8-16`
> >[1]  8 16
> >
> >> ## gives the row numbers for each unique row
> >
> >There may well be slicker ways to do this -- if this is actually what
> >you
> >want to do.
> >
> >-- Bert
> >
> >
> >
> >On Wed, Nov 7, 2018 at 7:56 PM li li <hannah.hlx using gmail.com> wrote:
> >
> >> Hi all,
> >>    I use the following example to illustrate my question. As you can
> >see,
> >> in matrix C some rows are repeated and I would like to find the
> >indices of
> >> the rows corresponding to each of the distinct rows.
> >>   For example, for the row c(1,9), I have used the "which" function
> >to
> >> identify the row indices corresponding to c(1,9). Using this
> >approach, in
> >> order to cover all distinct rows, I need to use a for loop.
> >>    I am wondering whether there is an easier way where a for loop can
> >be
> >> avoided?
> >>    Thanks very much!
> >>       Hanna
> >>
> >>
> >>
> >> > A <- matrix(c(1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16),8,2)> B <-
> >> rbind(A,A,A)> C <- as.data.frame(B[sample(nrow(B)),])> C   V1 V2
> >> 1   1  9
> >> 2   2 10
> >> 3   3 11
> >> 4   5 13
> >> 5   7 15
> >> 6   6 14
> >> 7   4 12
> >> 8   3 11
> >> 9   8 16
> >> 10  5 13
> >> 11  7 15
> >> 12  2 10
> >> 13  1  9
> >> 14  8 16
> >> 15  1  9
> >> 16  3 11
> >> 17  7 15
> >> 18  4 12
> >> 19  2 10
> >> 20  6 14
> >> 21  4 12
> >> 22  8 16
> >> 23  5 13
> >> 24  6 14> T <- unique(C)> T  V1 V2
> >> 1  1  9
> >> 2  2 10
> >> 3  3 11
> >> 4  5 13
> >> 5  7 15
> >> 6  6 14
> >> 7  4 12
> >> 9  8 16> > i <- 1                    > which(C[,1]==T[i,1]&
> >> C[,2]==T[i,2])[1]  1 13 15
> >>
> >>         [[alternative HTML version deleted]]
> >>
> >> ______________________________________________
> >> R-help using 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 using 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.
>
> --
> Sent from my phone. Please excuse my brevity.
>

	[[alternative HTML version deleted]]



More information about the R-help mailing list