简体   繁体   中英

conditionally multiply a vector by another r

I have the following vector

trans<- c(-2,3,10,-5,-2,56,0)

and I want to multiply each element by a choice of two vectors depending on whether the initial number is positive or negative

negtrans<-c(1,2,3)
postrans<-c(4,5,6,7)

the result should look like this -2 12 50 -10 -6 336 0

the key here is to keep the order intact

One way is

unsplit(Map(`*`, split(trans, trans>=0), 
               list(negtrans, postrans)),trans>=0)
#[1]  -2  12  50 -10  -6 336   0

Just multiply the corresponding entries with negtrans or postrans as required.

i <- which(trans < 0)
trans[i] <- trans[i] * negtrans
trans[-i] <- trans[-i] * postrans

However you will have a problem if the lengths of i and negtrans don't match.

I like akrun's answer for form, but it turns out not so great.

EDIT: here's a pretty dumb solution which is essentially the same as konvas' :

trans[trans<0]<-trans[trans<0]*negtrans
trans[trans>0]<-trans[trans>0]*postrans

And here's how it worked out:

trans<-sample(-100:100,1e5,rep=TRUE)
negtrans<-1:1e3
postrans<-1e4:100e4

    Unit: microseconds
                              expr     min      lq  median      uq
   carl(trans, negtrans, postrans)   6.415   7.697   8.126  11.546
  akrun(trans, negtrans, postrans) 204.832 210.390 223.220 234.337
 konvas(trans, negtrans, postrans)   5.560   5.987   6.415  10.263
     max neval
  29.934     5
 376.308     5
  15.395     5

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM