Thanks. It makes sense. Jeff Newmiller <jdnew...@dcn.davis.ca.us> 于2018年11月8日周四 下午8:05写道:
> The duplicated function returns TRUE for rows that have already > appeared... exactly one of the rows is not represented in the output of > duplicated. For the intended purpose of removing duplicates this behavior > is ideal. I have no idea what your intended purpose is, since every row has > duplicates elsewhere in the matrix. If you really want every set identified > this way then a loop/apply seems inevitable (most opportunities for > optimization come about by not visiting every combination). > > Cm <- as.matrix( C ) > D <- which( !duplicated( Cm, MARGIN=1 ) ) > nCm <- nrow( Cm ) > F <- lapply( D, function(d) { > idxrep <- rep( d, nCm ) > which( 0 == unname( rowSums( Cm[idxrep,] != Cm ) ) ) > } ) > > > On November 8, 2018 1:42:40 PM PST, li li <hannah....@gmail.com> wrote: > >Thanks to all the reply. I will try to use plain text in the future. > >One question regarding using "which( ! duplicated( m, MARGIN=1 ) )". > >This seems to return the fist row indices corresponding to the distinct > >rows but it does not give all the row indices > >corresponding to each of the distinct rows. For example, in the my > >example > >below, rows 1, 13 15 are all (1,9). > >Thanks. > > 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 > > > > > >Bert Gunter <bgunter.4...@gmail.com> 于2018年11月8日周四 上午10:43写道: > > > >> 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 > ><jdnew...@dcn.davis.ca.us> > >> wrote: > >> > >>> Perhaps > >>> > >>> which( ! duplicated( m, MARGIN=1 ) ) > >>> > >>> ? (untested) > >>> > >>> On November 7, 2018 9:20:57 PM PST, Bert Gunter > ><bgunter.4...@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....@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@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@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. > >>> > >> > > -- > Sent from my phone. Please excuse my brevity. > [[alternative HTML version deleted]] ______________________________________________ R-help@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.