2017-09-12 33 views
1

- 對不起的壞稱號計數週期,有什麼建議,以使其更清晰 -如何找到差異,直到條件被事後滿足R中

,我有以下的數據幀:

df <- data.frame(day = c(1,2,3,4,5,6,7,8,9,10,11), 
        score = c(67,51,52,57,66,63,63,68,64,57,77), 
        attempt = c(0,1,0,1,0,0,0,1,0,0,0)) 

我想計算每次嘗試發生時需要花費多少天才能超過分數> 10%的閾值。閾值只應該計算在嘗試之後發生的分數。

閾值簡單計算爲從嘗試到下一個> 10%的分數的百分比差異。對於表中低於此的第一個值是57/51-1 = 0.12

嘗試= 1

結果,我想的表給出了我過去的成績實際比例偏差嘗試時間以及所花費的天數。

Day Score Attempt Threshold Periods 
1 67  0  
2 51  1  12%   1 
3 52  0  
4 57  1  16%   0 
5 66  0  
6 63  0  
7 63  0  
8 68  1  13%   2 
9 64  0  
10 57  0  
11 77  0  
+0

你如何計算閾值? – Katerina

+0

除了卡特琳娜的問題,「週期」中的第一個值不應該等於1嗎?因爲只有一段時間過去了? –

+0

閾值是試圖中的分數與方差大於10%的分數之間的差異。是的,也許將時間段的分數設置爲1更有意義。 – Davis

回答

1

如果沒有你的threshold的是,你可以按照如下計算。我假設你有一些出發點start_score

start_score <- 45 
later_scores <- df$score[df$attempt == 1] 

target  <- c(start_score, later_scores) 
# 45 51 57 68  From these we want to calculate percentage increase:  

# -length(target) to remove the last value of target from the denominator 
pct_increase <- (diff(target)/target[-length(target)]) * 100 

df$threshold[df$attempt == 1] <- pct_increase 

隨着地方threshold專欄中,我們可以繼續:查找行中df$threshold > 10,然後用零之前那些指標和計算行數(

inds <- c(0, which(df$threshold > 10)) 

df$periods  <- rep(NA, 11) 
df$periods[inds] <- diff(inds)-1 

# day score attempt threshold periods 
# 1 67  0  NA  NA 
# 2 51  1 13.33333  1 
# 3 52  0  NA  NA 
# 4 57  1 11.76471  1 
# 5 66  0  NA  NA 
# 6 63  0  NA  NA 
# 7 63  0  NA  NA 
# 8 68  1 19.29825  3 
# 9 64  0  NA  NA 
#10 57  0  NA  NA 
#11 77  0  NA  NA 

編輯發現銷售點「嘗試」:即是行之間有df$threshold > 10週期) 在「DF $分數」的第一個值是麻煩的例證,因爲如果你買的塔t點,你只能在上個時期以+ 10%的價格出售。但是,如果你已經購買了,你應該立即在第一階段賣出。因此,我刪除了該數據幀這個值:

df <- data.frame(day = c(2,3,4,5,6,7,8,9,10,11), 
       score = c(51,52,57,66,63,63,68,64,57,77), 
       attempt = c(1, rep(NA, 9))) 

如果我理解正確的話,你會到達後,分數比在您購買了期分數高出10%出售。與此同時,您還可以在賣出期間立即再次購買,對吧?所以你賣你新買的股票等到比分再次由10%上升(?):

sell_time1 <- 1 
repeat{ 
    sell_thres <- df$score[sell_time1] * 1.1 
    sell_time2 <- min(which((df$score > sell_thres) & (df$day > df$day[sell_time1]))) 
    ifelse(sell_time2 == sell_time1, break, sell_time1 <- sell_time2) 
    df$attempt[sell_time1] <- 1 
} 

這將產生一個警告,因爲在repeat{}的第二行的一些點sell_time2將嘗試取空​​向量的最小值。在這個應用程序中,這是沒有什麼可擔心的。它會導致:

# day score attempt 
# 2 51  1 
# 3 52  NA 
# 4 57  1 
# 5 66  1 
# 6 63  NA 
# 7 63  NA 
# 8 68  NA 
# 9 64  NA 
# 10 57  NA 
# 11 77  1 
+0

謝謝,但我需要根據嘗試列先找到閾值。對於每一次嘗試,我都需要找到下面哪個嘗試的變化大於10%。 – Davis

+0

偏差也可以爲負10%嗎?或者你只是在尋找增加? –

+0

只增加,即第一次增加超過了10%的門檻。 – Davis