2011-01-20 2 views
4

크기가이고 성공률이 떨어지고 있습니다.이 질문은 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합니다 (xsubRes 분할 후 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 이상에서 함수는 조건을 변경 함에도 불구하고 잘못된 입력을 사용합니다.

무슨 명백한 점이 있습니까?

+2

나는 답변을 게시 할만큼 충분히 잘하지는 않지만, WinStreakSize 함수가 실제로 가장 긴 줄무늬 (이기거나 잃어 버림)를 반환한다고 생각합니다. 가장 긴 줄무늬가 당신의 예에서 줄무늬를 이겨내는 것입니다. – Henrik

+0

@Henrik 당신은 내 것이 아닙니다. 와우! 나는 조금 짜증이났다. – Henrik

+0

btw : 'rle'이 무엇을하는지, 내 다른 자기보다 옳은 것 같습니다 ... – Henrik

답변

5

rle(ifelse(x>0,1,0))은 기본적으로 rle(ifelse(x<0,1,0)) 또는 rle(x>0) 또는 rle(x<0)과 같으며 실행 값이 다릅니다. 그러나 함수에서 실행의 값으로 작업하지 않으므로 문제가되지 않습니다. 값이 아닌 길이를 선택하면 매번 동일한 결과가 나타납니다.

조금 단순화시켜 드리겠습니다. 기본 함수를 사용하여 실행 길이와 합계를 계산합니다. 문제의 해결책이 정확하지 않다는 것을 고려하십시오. JPM에 대해 가장 긴 부정적인 실행이 2 번 있습니다. 나는 절대 값이 가장 큰 것을 반환하기로했다.

이러한 종류의 문제는 그룹 수와 실행 길이에 따라 일종의 색인을 얻는 것이 좋습니다. 그렇게되면 삶이 훨씬 쉬워집니다. 이를 통해 합계, 평균 등을 간단하게 계산할 수 있습니다. tapply.같은 길이 (ll, sumsval)의 세 벡터를 만든 후에는 길이, 값 및 실행 합계를 쉽게 연결하고 나가기를 원하는 항목을 선택할 수 있습니다.

rle (x> 0)을 사용할 때의 이점은 값을 색인으로 사용하면 작업을 크게 단순화 할 수 있다는 것입니다.

+0

답장을 보내 주신 Joris에게 감사드립니다. 코드가 적어 출력이 향상되었습니다. 가장 큰 값으로 실행을 반환하는 것은 완벽합니다! 여러분의 코드에서'll' 변수가 인덱스를 제공한다고 말하면서 올바른 것인데, 이는'val'과 함께 특정 포인트의 값에 접근 할 수 있습니까? 이 경우'R'의 값이 R이 그들 사이를 구별하도록 고유하지 않아야합니까? (이제는 JPM의 경우 1,4,2,1,2입니다.) (Btw, 이것은 비판이 아닙니다. 해결책은 완벽합니다. 나는이 문제를 해결하는 데 사용한 생각에 대해 더 자세히 보려고합니다. :) – Jura25

+0

@ Jura25 Jori의 대답은 내가 말하려고했던 것을 다루었습니다. - 본질적으로, 이전 질문에서 다른 답변 중 하나를 택한 것입니다. 답이 업데이트 된 곳은 잃어버린 줄이 연승보다 길면 선택했을 것입니다. 나는 승리를 얻는 방법과 줄을 잃는 방법을 보여주기 위해 나의 대답을 업데이트했다. @Joris 대답은이 모든 아이디어를 멋지게 결합한다. (+1) –

+1

@ Jura25 ll은 실행의 길이이고, val은 실행을위한 값이다. (TRUE 또는 FALSE)이고 id는 원래 벡터 x에 사용될 인덱스입니다. ngroups는 번호이거나 실행됩니다. 함수의 첫 번째 줄에 browser()를 추가하면 내부적으로 어떻게 보이는지 확인할 수 있습니다. '? browser'도 참조하십시오. –