我有以下向量
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
这里的关键是保持订单完好无损
发布于 2014-11-04 15:16:41
一种方法是
unsplit(Map(`*`, split(trans, trans>=0),
list(negtrans, postrans)),trans>=0)
#[1] -2 12 50 -10 -6 336 0发布于 2014-11-04 15:20:03
只需根据需要将相应的条目与反式或postrans相乘即可。
i <- which(trans < 0)
trans[i] <- trans[i] * negtrans
trans[-i] <- trans[-i] * postrans然而,如果I和否定反式的长度不匹配,你就会有问题。
发布于 2014-11-04 16:24:48
我喜欢阿克兰对形式的回答,但结果不太好。
编辑:这里有一个非常愚蠢的解决方案,本质上与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 5https://stackoverflow.com/questions/26738551
复制相似问题