- 抱歉标题不好,有什么建议可以说清楚吗? -
我有以下数据框:
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 :(得分: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