有条件地将矢量乘以另一个r

时间:2014-11-04 15:11:07

标签: r conditional-statements

我有以下载体

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

我希望将每个元素乘以两个向量的选择,具体取决于初始数字是正数还是负数

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

结果应如下所示 -2 12 50 -10 -6 336 0

这里的关键是保持订单不变

3 个答案:

答案 0 :(得分:5)

一种方法是

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

答案 1 :(得分:2)

只需将相应的条目与negtrans或postrans相乘即可。

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

但是如果i和negtrans的长度不匹配,你会遇到问题。

答案 2 :(得分:2)

我喜欢akrun对形式的回答,但事实并非如此。

编辑:这是一个非常愚蠢的解决方案,与konvas'基本相同:

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

以下是它的成功方法:

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