크기가이고 성공률이 떨어지고 있습니다.이 질문은 earlier question의 길이를 계산하려고했을 때의 후속 조치입니다. 줄무늬. 내가 가장 긴 승리와 연패의 크기를 계산하려면 각 기기 :승리 및 손실 행진의 크기 계산
> 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
> dput(subRes)
structure(list(Instrument = structure(c(1L, 1L, 1L, 1L, 1L, 1L,
1L, 1L, 1L, 1L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L), .Label = c("JPM",
"KFT"), class = "factor"), TradeResult.Currency. = c(-3, 264,
284, 69, 283, -219, -91, 165, -35, -294, -8, -48, 125, -150,
-206, 107, 107, 56, -26, 189)), .Names = c("Instrument", "TradeResult.Currency."
), class = "data.frame", row.names = c(NA, 20L))
내 목표 :
이처럼 내 데이터는 모습입니다. 따라서 JPM
의 경우 위의 데이터에서 행 2, 3, 4 및 5가되며 다음과 같은 TradeResult.Currency.
값을 갖습니다. 총 값은 264 + 284 + 69 +283이며 총 길이는 900입니다. JPM의 경우 행 9와 행 10이 될 것이므로 총 결과는 -329 (-35 + -294)입니다. KFT
의 경우 최장 연승의 크기는 270 (107 + 107 + 56, 18에서 18 행까지)이며 가장 긴 손실 행렬의 크기는 -356 (-150 + -206, 행 14 & 15)입니다. 결과적으로 다음과 같은 기능이 연승의 정확한 크기를 제공
...
WinStreakSize <- 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(sum(out))
}
.. 그러나
> with(subRes, tapply(TradeResult.Currency., Instrument, WinStreakSize)
+)
JPM KFT
900 270
는 I 표시하기 위해이 기능을 능숙 수없는 것 가장 길게지는 패배의 크기 (JPM은 -329, KFT는 -356을 출력 할 수 있도록), 얼마나 어리석은가. 나는 여러 가지 방법으로 기능을 바꾸려고 노력했다. 그것을 제거하고 다시 만들었다. 나는 그것의 원인을 찾을 수 없다. 여기
는 I합니다 (x
값 subRes
분할 후 JPM 대한 값이다 함수 디버깅에서 출력)의 의미는 : 그래서 Browse[2]> ifelse(x > 0, 1, 0)
[1] 0 1 1 1 1 0 0 1 0 0
Browse[2]> ifelse(x < 0, 1, 0)
[1] 1 0 0 0 0 1 1 0 1 1
Browse[2]> rle(ifelse(x > 0, 1, 0))
Run Length Encoding
lengths: int [1:5] 1 4 2 1 2
values : num [1:5] 0 1 0 1 0
Browse[2]> rle(ifelse(x < 0, 1, 0))
Run Length Encoding
lengths: int [1:5] 1 4 2 1 2
values : num [1:5] 1 0 1 0 1
Browse[2]> inverse.rle(ifelse(x > 0, 1, 0))
Error in x$lengths : $ operator is invalid for atomic vectors
Browse[2]> rle(!ifelse(x < 0, 1, 0))
Run Length Encoding
lengths: int [1:5] 1 4 2 1 2
values : logi [1:5] FALSE TRUE FALSE TRUE FALSE
이 함수의 조건을 변경 출력에 차이가 없습니다 함수의. 그것은 내가 해결책을 찾기 위해 함수의 잘못된 부분을보고 있다고 제안 할 것이지만, ifelse
문장은 함수의 첫 번째 것이다. 즉, 라인 1 이상에서 함수는 조건을 변경 함에도 불구하고 잘못된 입력을 사용합니다.
무슨 명백한 점이 있습니까?
나는 답변을 게시 할만큼 충분히 잘하지는 않지만, WinStreakSize 함수가 실제로 가장 긴 줄무늬 (이기거나 잃어 버림)를 반환한다고 생각합니다. 가장 긴 줄무늬가 당신의 예에서 줄무늬를 이겨내는 것입니다. – Henrik
@Henrik 당신은 내 것이 아닙니다. 와우! 나는 조금 짜증이났다. – Henrik
btw : 'rle'이 무엇을하는지, 내 다른 자기보다 옳은 것 같습니다 ... – Henrik