[英]Replacing 0 in particular order using nested if and for loop in r
我正在嘗試通過使用for和嵌套在r中來解決以下問題:我的可用價格數據是:test2
test2 <- c(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 399, 0, 0, 399, 0, 0, 0, 0, 399, 0, 0, 0, 0, 429, 0, 429,
0, 0, 0, 499, 0, 429, 0, 0, 0, 0, 0, 529, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0)
問題:將第一次出現價格之前的0替換為第一次出現的值,然后將第一次出現之后的0替換為第一次出現的值,直到第二次出現價格,依此類推。 最后一次出現的價格后的0應該替換為最后一次出現的值。
我使用了以下代碼:
priceposition2 <- which(test2>0)
for(i in 1:length(priceposition2)){
for(m in 1:length(test2)){
if (m <= priceposition2[1]){
test2[m] <- test2[priceposition2[1]]
} else if (m > priceposition2[1]){
if (m> priceposition2[i] && m < priceposition2[i+1]){
test2[m] <- test2[priceposition2[i]]
}else if(m> priceposition2[length(priceposition2)]){
test2[m] <- test2[priceposition2[length(priceposition2)]]
}
}
m=m+1
}
i=i+1
}
在此之后,我得到以下結果:
[1] 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399
399 399 399 399 399
[24] 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399
399 399 399 399 399
[47] 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399
399 399 399 399 399 399
[70] 399 399 399 399 399 399 399 399 429 429 429 429 429 429 499 499 429 429
429 429 429 429 529
[93] 529 529 529 529 529 529 529 529 529 529 529 529 529 529 529 529 529 529
529 529 529 529 529
[116] 529 529 529 529 529 529 529 529 529 529 529 529 529 529
這正是我想要的。 問題是我通過使用上面的代碼得到錯誤:
Error in if (m > priceposition2[i] && m < priceposition2[i + 1]) { :
missing value where TRUE/FALSE needed
我做錯了什么嗎? 還有解決上述問題的替代方法嗎?
您可以使用來自zoo
軟件包的na.locf
來執行此操作。 基本上,您首先要用NA替換所有零。 然后使用na.locf
na.rm = FALSE
na.locf
轉發來保持領先的NA。 然后使用na.locf
fromLast=TRUE
向后使用fromLast=TRUE
將前導NA更改為第一個值。
priceposition2<-c(0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,399,0,0,399,0,
0,0,0,399,0,0,0,0,429,0,429,0,0,0,499,0,429,0,
0,0,0,0,529,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0)
library(zoo)
priceposition2[priceposition2==0] <- NA
na.locf(na.locf(priceposition2,na.rm = FALSE),fromLast=TRUE)
[1] 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399
[33] 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399 399
[65] 399 399 399 399 399 399 399 399 399 399 399 399 399 429 429 429 429 429 429 499 499 429 429 429 429 429 429 529 529 529 529 529
[97] 529 529 529 529 529 529 529 529 529 529 529 529 529 529 529 529 529 529 529 529 529 529 529 529 529 529 529 529 529 529 529 529
[129] 529
Reduce
基數R非常適合您所追求的目標( v
是您的向量):
Reduce(function(x,y) ifelse(y==0, x, y), v, accumulate=TRUE, init = v[v>0][1])[-1]
您可以使用零值以上的位置作為間隔邊界,在整個矢量的索引中使用findInterval
。 然后,您可以使用這些間隔號交換正確的零以上值(第一個用於兩個間隔)。
above_zero <- which(test2 > 0)
carryover_from <- findInterval(seq_along(test2), c(0, above_zero))
carryover_values <- c(test2[above_zero[1]], test2[above_zero])
test2 <- carryover_values[carryover_from]
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.