我正在尝试计算数据集中的最大连续获胜或失败次数(即连续正值或负值的最高数量)。我在StackOverflow上找到了一个相关问题,尽管那个问题给了我一些好建议,但是那个问题的角度不同,而且我还没有足够的经验来将那些信息翻译并应用到这个问题上。所以我希望你能帮我解决这个问题,即使只有一个建议也会很棒。
我的数据集看起来像这样:
在这种情况下,JPM的最大(获胜)连胜次数为四次(即连续264、284、69和283次正结果),而KFT的该值为3次(107、107、56)。
我的目标是创建一个函数,以每个工具的最大连胜次数为依据(即JPM:4,KFT:3)。为了实现这一点:
R需要将当前结果与先前结果进行比较,如果更高,则至少有2个连续的正结果。然后R需要查看下一个值,如果这个值也更高:则在已找到的2个值上加1。如果这个值不高,则R需要移动到下一个值,同时将2作为中间最大值记住。
我尝试了cumsum和cummax来符合条件求和(例如cumsum(c(TRUE,diff(subRes [,2])> 0))),但没有成功。还使用rle与lapply相结合(例如lapply(rle(subRes $ TradeResult.Currency.),function(x) diff(x)> 0)),但也没有成功。
我该如何使其工作?
2021年1月19日编辑
计算连胜次数大小 除了连胜次数之外,我还想将连胜次数的大小纳入我的分析。根据以下提供的答案,我认为我能够自己完成它,但遗憾的是我犯了以下问题:
然而,当更改
我的数据集看起来像这样:
> subRes
Instrument TradeResult.Currency.
1 JPM -3
2 JPM 264
3 JPM 284
4 JPM 69
5 JPM 283
6 JPM -219
7 JPM -91
8 JPM 165
9 JPM -35
10 JPM -294
11 KFT -8
12 KFT -48
13 KFT 125
14 KFT -150
15 KFT -206
16 KFT 107
17 KFT 107
18 KFT 56
19 KFT -26
20 KFT 189
> split(subRes[,2],subRes[,1])
$JPM
[1] -3 264 284 69 283 -219 -91 165 -35 -294
$KFT
[1] -8 -48 125 -150 -206 107 107 56 -26 189
在这种情况下,JPM的最大(获胜)连胜次数为四次(即连续264、284、69和283次正结果),而KFT的该值为3次(107、107、56)。
我的目标是创建一个函数,以每个工具的最大连胜次数为依据(即JPM:4,KFT:3)。为了实现这一点:
R需要将当前结果与先前结果进行比较,如果更高,则至少有2个连续的正结果。然后R需要查看下一个值,如果这个值也更高:则在已找到的2个值上加1。如果这个值不高,则R需要移动到下一个值,同时将2作为中间最大值记住。
我尝试了cumsum和cummax来符合条件求和(例如cumsum(c(TRUE,diff(subRes [,2])> 0))),但没有成功。还使用rle与lapply相结合(例如lapply(rle(subRes $ TradeResult.Currency.),function(x) diff(x)> 0)),但也没有成功。
我该如何使其工作?
2021年1月19日编辑
计算连胜次数大小 除了连胜次数之外,我还想将连胜次数的大小纳入我的分析。根据以下提供的答案,我认为我能够自己完成它,但遗憾的是我犯了以下问题:
> subRes
Instrument TradeResult.Currency.
1 JPM -3
2 JPM 264
3 JPM 284
4 JPM 69
5 JPM 283
6 JPM -219
7 JPM -91
8 JPM 165
9 JPM -35
10 JPM -294
11 KFT -8
12 KFT -48
13 KFT 125
14 KFT -150
15 KFT -206
16 KFT 107
17 KFT 107
18 KFT 56
19 KFT -26
20 KFT 189
> lapply(split(subRes[,2], subRes[,1]), function(x) {
+ df.rle <- ifelse(x > 0, 1, 0)
+ df.rle <- rle(df.rle)
+
+ wh <- which(df.rle$lengths == max(df.rle$lengths))
+ mx <- df.rle$lengths[wh]
+ suma <- df.rle$lengths[1:wh]
+ out <- x[(sum(suma) - (suma[length(suma)] - 1)):sum(suma)]
+ return(out)
+ })
$JPM
[1] 264 284 69 283
$KFT
[1] 107 107 56
这个结果是正确的,将最后一行改为return(sum(out))
,我可以得到连续出现的总大小:
$JPM
[1] 900
$KFT
[1] 270
然而,当更改
ifelse
条件时,该函数似乎没有计算连续失败的情况:lapply(split(subRes[,2], subRes[,1]), function(x) {
df.rle <- ifelse(x < 0, 1, 0)
df.rle <- rle(df.rle)
wh <- which(df.rle$lengths == max(df.rle$lengths))
mx <- df.rle$lengths[wh]
suma <- df.rle$lengths[1:wh]
out <- x[(sum(suma) - (suma[length(suma)] - 1)):sum(suma)]
return(out)
})
$JPM
[1] 264 284 69 283
$KFT
[1] 107 107 56
我不知道我需要改变这个函数的什么地方才能最终得出输球连败的总和。无论我如何调整/更改这个函数,我都得到相同的结果或错误。ifelse
函数让我感到困惑,因为它似乎是要更改的函数的明显部分,但并没有导致任何变化。我错过了什么明显的点吗?