我想计算以下逻辑的总和。每当数字从0切换到-1或1时,以及当数字在1和-1之间切换时,基本上将一个加到numTrade。将连续元素视为0,使(0,1,1,1)计为1,(1,0,-1,1)计为2。
numTrade应该总共返回4,但它返回3.有人可以解释原因吗?
{{1}}
答案 0 :(得分:1)
这是一个"矢量化"相当于你应该做的事情:
numUnits <- c(0, 1, 0, -1, 1, 1, -1)
absDiff <- abs(diff(numUnits))
numTrade <- sum((head(numUnits, -1) == 0 & absDiff == 1) | absDiff == 2)
print(numTrade)
结果是4。
for
循环非常慢。在这种情况下,矢量版本的速度提高了约50倍(使用microbenchmark
包测量)。
答案 1 :(得分:0)
请检查以下代码,
numTrade<-0
numUnits<-c(0,1,0,-1,1,1,-1)
for(i in 2:length(numUnits)){
print( sprintf("numUnits[I-1]: numUnits[I]: %d -> %d ", numUnits[i-1], numUnits[i]))
if((numUnits[i-1]<0 & numUnits[i]>0) | numUnits[i-1]>0 & numUnits[i]<0 ){
print( "Match for between 1 to -1")
numTrade<-numTrade+1
}
else if( numUnits[i-1]==0 & numUnits[i]!=0 ){
print( "Match for 0 to 1/-1")
numTrade<-numTrade+1
}
else {
numTrade<-numTrade+0
}
}
print( numTrade)
这里我们需要检查2个条件,一个在1到-1之间,另一个在0到1 / -1之间。