2017-01-14 88 views
0

我試圖找出最近的位置來表示關閉位置(cP)。R錯誤:替換長度爲零

比方說,我有以下幾點:

indicator.Trade=c(1,1,0,0,-1,0,0,0,1,1,0,-1,-1) 
cP=c(NA,NA,1,1,NA,-1,NA,NA,1,NA,NA,1,NA) 

## If indicator.Trade[1] is 1, I want to obtain order.book[1,1]=1 and order.book[2,1]=3. 
## If indicator.Trade[2] is 1, I want to obtain order.book[1,2]=2 and order.book[2,2]=3. 

order.book=matrix(0,nrow=2,ncol=(length(indicator.Trade)-1)) 
for(i in 1:(length(indicator.Trade)-1)){ 
    if((indicator.Trade[i]==1)){ 
     order.book[1,i]=i 
     order.book[2,i]=head(which(cP[c((i):(length(indicator.Trade)-1))]==1),1) 
    } else if(indicator.Trade[i]==-1){ 
     order.book[1,i]=i 
     order.book[2,i]=head(which(cP[c((i):(length(indicator.Trade)-1))]==-1),1) 
    } else { 
     order.book[1,i]=i 
     order.book[2,i]=0 
    } 
} 

但是運行上面的代碼,我收到以下錯誤:

in order.book[2, i] = head(which(cP[c((i):(length(indicator.Trade) - : 
    replacement has length zero 

我試着手動替換:

i=1 and i=(length(indicator.Trade)-1) 

至於建議在Simple for loop in R producing "replacement has length zero" in R檢查數字(0),但似乎並非如此。我在這裏錯過了什麼?

編輯

我剛剛意識到

head(which(cP[c(((length(indicator.Trade)-1)):(length(indicator.Trade)-1))]==1),1) 
[1] 1 

所以,我對查找正確的索引位置的代碼將是錯誤的。不過,我仍然期待它能夠運行。

回答

0

您正在收到該錯誤,因爲您試圖指定長度爲零的值。將這行代碼print(which(cP[c((i):(length(indicator.Trade)-1))]==-1))置於else if()塊內,並看到錯誤來自那裏。這是因爲:用於獲得兩個數字之間的序列。在這裏,您正在嘗試使用空值來獲取序列,這是無效的操作。它發生在else if區塊的第12列。我在下面的代碼中添加了print語句。

試試這個小練習,看看發生了什麼

a1 <- NULL # create a null variable 
1:a1   # generate sequence using `:` 
# Error in 1:a1 : argument of length 0 

這就是爲什麼我在使用​​功能循環。閱讀?seq_len?seq_along手冊頁。

修改後的代碼

indicator.Trade=c(1,1,0,0,-1,0,0,0,1,1,0,-1,-1) 
cP=c(NA,NA,1,1,NA,-1,NA,NA,1,NA,NA,1,NA) 
len_ind_tr <- length(indicator.Trade) 

order.book <- matrix(0,nrow=2,ncol=len_ind_tr-1)) 

for(i in seq_len(len_ind_tr-1)){ 
    if(indicator.Trade[i] == 1){ 
    order.book[1,i] <- i 
    order.book[2,i] <- which(cP[i:(len_ind_tr-1)] == 1)[1] 
    } else if(indicator.Trade[i] == -1){ 
    order.book[1,i] <- i 
    order.book[2,i] <- which(cP[i:(len_ind_tr-1)] == -1)[1] 
    print(which(cP[i:(len_ind_tr-1)] == -1)) 
    } else { 
    order.book[1,i] <- i 
    order.book[2,i] <- 0 
    } 
} 

order.book 
#  [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10] [,11] [,12] 
# [1,] 1 2 3 4 5 6 7 8 9 10 11 12 
# [2,] 3 2 0 0 2 0 0 0 1  3  0 NA 
+0

考慮在那裏我已經買了次新股的情況下:1,3,4;這是指標。在這種情況下進行交易。 現在,我想出售我的股票,只要符合某些條件。所以如果時間滿足條件:2,5 ...在時間= 2時,我想賣出1股,在時間= 5時,我想賣出3和4的股票。這就是cP的目的;以指示何時符合條件。希望能幫助解釋我在做什麼。如果可能的話,你有沒有機會知道如何獲得正確的索引位置? – mathnoob

+0

我想當你說索引時,你指的是數據結構中的下標和子集值? – Sathish

+0

下標和子集化可以通過'$','[]'和'[[]]'完成。您可以根據變量 – Sathish