Leeds, Mark (IED)
2007-Aug-24 21:12 UTC
[R] Turning a logical vector into its indices without losing its length
I have the code below which gives me what I want for temp based on logvec but I was wondering if there was a shorter way ( i.e : a one liner ) without having to initialize temp to zeros. This is purely for learning purposes. Thanks. logvec <- c(TRUE,FALSE,FALSE,TRUE,FALSE,FALSE,TRUE,FALSE) temp<-numeric(length(invec)) temp[invec]<-which(invec) temp [1] 1 0 0 4 0 0 7 0 obviously, the code below doesn't work. temp <- which(invec)> temp[1] 1 4 7 -------------------------------------------------------- This is not an offer (or solicitation of an offer) to buy/se...{{dropped}}
Leeds, Mark (IED)
2007-Aug-24 21:14 UTC
[R] Turning a logical vector into its indices without losing itslength
There's a typo in my previous message. logvec should be invec. sorry. -----Original Message----- From: r-help-bounces at stat.math.ethz.ch [mailto:r-help-bounces at stat.math.ethz.ch] On Behalf Of Leeds, Mark (IED) Sent: Friday, August 24, 2007 5:12 PM To: r-help at stat.math.ethz.ch Subject: [R] Turning a logical vector into its indices without losing itslength I have the code below which gives me what I want for temp based on logvec but I was wondering if there was a shorter way ( i.e : a one liner ) without having to initialize temp to zeros. This is purely for learning purposes. Thanks. logvec <- c(TRUE,FALSE,FALSE,TRUE,FALSE,FALSE,TRUE,FALSE) temp<-numeric(length(invec)) temp[invec]<-which(invec) temp [1] 1 0 0 4 0 0 7 0 obviously, the code below doesn't work. temp <- which(invec)> temp[1] 1 4 7 -------------------------------------------------------- This is not an offer (or solicitation of an offer) to buy/se...{{dropped}} ______________________________________________ R-help at stat.math.ethz.ch mailing list 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. -------------------------------------------------------- This is not an offer (or solicitation of an offer) to buy/se...{{dropped}}
Gabor Grothendieck
2007-Aug-24 21:20 UTC
[R] Turning a logical vector into its indices without losing its length
Here are two solutions:> logvec <- c(TRUE,FALSE,FALSE,TRUE,FALSE,FALSE,TRUE,FALSE)> ifelse(logvec, seq_along(logvec), 0)[1] 1 0 0 4 0 0 7 0> replace(logvec * 0, logvec, which(logvec))[1] 1 0 0 4 0 0 7 0 On 8/24/07, Leeds, Mark (IED) <Mark.Leeds at morganstanley.com> wrote:> I have the code below which gives me what I want for temp based on > logvec but I was wondering if there was a shorter way ( i.e : > a one liner ) without having to initialize temp to zeros. This is > purely for learning purposes. Thanks. > > logvec <- c(TRUE,FALSE,FALSE,TRUE,FALSE,FALSE,TRUE,FALSE) > > temp<-numeric(length(invec)) > temp[invec]<-which(invec) > temp > > [1] 1 0 0 4 0 0 7 0 > > obviously, the code below doesn't work. > > temp <- which(invec) > > temp > [1] 1 4 7 > -------------------------------------------------------- > > This is not an offer (or solicitation of an offer) to buy/se...{{dropped}} > > ______________________________________________ > R-help at stat.math.ethz.ch mailing list > 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. >
Achim Zeileis
2007-Aug-24 21:20 UTC
[R] Turning a logical vector into its indices without losing its length
On Fri, 24 Aug 2007, Leeds, Mark (IED) wrote:> I have the code below which gives me what I want for temp based on > logvec but I was wondering if there was a shorter way ( i.e : > a one liner ) without having to initialize temp to zeros. This is > purely for learning purposes. Thanks. > > logvec <- c(TRUE,FALSE,FALSE,TRUE,FALSE,FALSE,TRUE,FALSE)R> logvec[logvec] <- which(logvec) R> logvec [1] 1 0 0 4 0 0 7 0 hth, Z> temp<-numeric(length(invec)) > temp[invec]<-which(invec) > temp > > [1] 1 0 0 4 0 0 7 0 > > obviously, the code below doesn't work. > > temp <- which(invec) > > temp > [1] 1 4 7 > -------------------------------------------------------- > > This is not an offer (or solicitation of an offer) to buy/se...{{dropped}} > > ______________________________________________ > R-help at stat.math.ethz.ch mailing list > 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. > >
François Pinard
2007-Aug-24 22:41 UTC
[R] Turning a logical vector into its indices without losing its length
[Leeds, Mark (IED)]>I have the code below which gives me what I want for temp based on >invec but I was wondering if there was a shorter way ( i.e : >a one liner ) without having to initialize temp to zeros. This is >ppurely for learning purposes. Thanks.>invec <- c(TRUE,FALSE,FALSE,TRUE,FALSE,FALSE,TRUE,FALSE)>temp<-numeric(length(invec)) >temp[invec]<-which(invec) >temp>[1] 1 0 0 4 0 0 7 0A mere: invec * seq_along(invec) would do it. To be honest, I dislike the multiplication trickery, and so prefer Gabor's solution, even if a bit longer: ifelse(invec, seq_along(invec), 0) -- Fran?ois Pinard http://pinard.progiciels-bpi.ca