我有以下载体
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
这里的关键是保持订单不变
答案 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