如何在R中的事件之后找到满足条件的方差和计数周期

时间:2017-09-12 14:05:29

标签: r loops

- 抱歉标题不好,有什么建议可以说清楚吗? -

我有以下数据框:

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     

1 个答案:

答案 0 :(得分: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的行,然后在这些索引前面加零,并计算介于两者之间的行数(即句点) 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

编辑以找到卖点&#39;尝试&#39; : &#39; df $得分&#39;中的第一个值这很麻烦,因为如果你在那个时候购买,你只能在最后一个时期以+ 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
}

这将产生警告,因为在sell_time2的第二行中的某个点repeat{}将尝试采用空向量的最小值。在这个应用程序中,这没什么好担心的。这将导致:

#    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