XTS는

2017-11-13 1 views
3

내가 입찰를 포함하는 다음 XTS 개체가 말 Object에서 순차적으로 반복 행을 제거하고 물어 데이터 :XTS는

Time  Bid Ask 
    00:01 10  11 
    00:03 11  12 
    00:04 12  13 
    00:05 10  11 

    00:08 9  12 
    00:09 2  10 
    00:10 4  5 

하는 행은해야한다 :

Time  Bid Ask 
    00:01 10  11 
    00:02 10  11 
    00:03 11  12 
    00:04 12  13 
    00:05 10  11 
    00:06 10  11 
    00:07 10  11 

    00:08 9  12 
    00:09 2  10 
    00:10 4  5 

나는 다음과 같은 출력을 좀하고 싶습니다 이전 항목과 동일하면 제거됩니다. Bid 또는 Ask로 변경 한 경우 제거되지 않으므로 복제를 꺼내면 작동하지 않습니다.

이것은 이전에했던 것처럼 상당히 간단해야하지만 어떻게 기억할 수 없으며 찾을 수 없습니다.

업데이트 : 초기 데이터와 예상 출력에 몇 가지 추가 항목을 추가했습니다.

Joshua의 쉐이더는 훌륭하지만 다른 결과를주는 rowSums와 같은 함수에 따라 달라 지지만 912로 나뉩니다. 작동하는 matrixStats 패키지에서 rowProds 함수를 사용했지만 마지막 2 줄에서는 분명히 실패합니다 . 또한, 필자의 샘플 1 열의 값은 2 열보다 작습니다. 이해가되는 동안 필 수 없습니다. 그러면 Ask가 RowSum 및 rowProds 둘 다 실패하는 입찰보다 적을 경우 함수가 작동해야합니다. 어쩌면 행 해시 같은 다른 것이 있으면 항상 다른 결과를주는 더 나은 행 기능이 있습니까?

답변

3

각 행의 합계에 rle()을 사용하여이 작업을 수행 할 수 있습니다. 각 그룹의 마지막 관찰을 원하는 경우 부분 집합 때

x <- structure(
    c(10L, 10L, 11L, 12L, 10L, 10L, 10L, 11L, 11L, 12L, 13L, 11L, 11L, 11L), 
    .Dim = c(7L, 2L), .Dimnames = list(NULL, c("Bid", "Ask")), 
    index = structure(1:7, tzone = "", tclass = c("POSIXct", "POSIXt")), 
    .indexCLASS = c("POSIXct", "POSIXt"), .indexTZ = "", 
    tclass = c("POSIXct", "POSIXt"), tzone = "", class = c("xts", "zoo")) 
r <- rle(rowSums(x)) 

, 당신은 행 인덱스로 cumsum(r$lengths)을 사용할 수 있습니다. 각 그룹의 첫 번째 관찰을 원하기 때문에

R> x[cumsum(r$lengths),] 
        Bid Ask 
1969-12-31 18:00:02 10 11 
1969-12-31 18:00:03 11 12 
1969-12-31 18:00:04 12 13 
1969-12-31 18:00:07 10 11 

, 당신은 1이 (당신은 항상 첫 번째 관찰을 원하는)를 사용하여 r$lengths 벡터를 앞에 추가하고 r$lengths의 마지막 요소를 제거해야합니다. 그런 다음 cumsum()으로 전화하십시오. rowSums()의 한계에

R> x[cumsum(c(1, head(r$lengths, -1))),] 
        Bid Ask 
1969-12-31 18:00:01 10 11 
1969-12-31 18:00:03 11 12 
1969-12-31 18:00:04 12 13 
1969-12-31 18:00:05 10 11 

좋은 캐치. 확고한 해결책은 입찰가를 diff()으로하고 어느 것이 든 0이 아닌 행을 묻고 선택합니다.

d <- diff(x) != 0   # rows with price changes 
d[1,] <- TRUE    # always select first observation 
g <- cumsum(d$Bid | d$Ask) # groups of repeats 
r <- rle(as.numeric(g))  # run length encoding on groups 

# now use the solution above 
x[cumsum(c(1, head(r$lengths, -1))),] 
+1

그것은 훌륭하고 정확히 작동하는 방법을 알아 내려면 시간이 더 필요합니다. 나는 rowSums가 다음 줄이 00:08 9 12 인 것처럼 조금 제한하고 있다고 생각한다. 다행히도 matrixStats 패키지는 rowProds 명령을 사용하여 더 잘 처리한다. 실수로 행을 제거하지 않도록하는 더 나은 옵션이 있습니까? 고맙습니다. – MichaelE

+0

@MichaelE : 버그를 잘 파악합니다. 업데이트 된 대답은보다 강력하며 추가 종속성을 유발하지 않습니다. –

+0

감사합니다. diff는 모든 것을 처리합니다. – MichaelE

관련 문제