2017-01-25 3 views
0

여기에는 아주 직접적인 질문이 있습니다.data.table을 사용한 배포판 계산

나는 stackoverflow 및 google에 대한 모든 관련 게시물에 대한 검색을했지만 답변을 찾지 못했습니다. 히스토그램 또는 Hist 객체에 대한 준비 작업과 유사

Time Price Volume Amount Flag 1: 2016-01-04 09:05:06 105.0 9500 993700 1 2: 2016-01-04 09:20:00 104.1 23500 2446350 0 3: 2016-01-04 09:30:00 104.1 18500 1924550 1 4: 2016-01-04 09:30:01 103.9 12500 1300550 0 5: 2016-01-04 09:30:02 104.1 16118 1675233 1 6: 2016-01-04 09:30:05 104.0 13000 1352200 0 7: 2016-01-04 09:30:06 104.1 2500 260100 1 8: 2016-01-04 09:30:07 104.1 1500 156150 1 9: 2016-01-04 09:30:08 104.3 500 52150 1 10: 2016-01-04 09:30:10 104.0 1000 104000 0 11: 2016-01-04 09:30:11 103.9 1000 103900 0 12: 2016-01-04 09:30:15 104.0 3500 364450 1 13: 2016-01-04 09:30:17 104.3 2000 208450 1 14: 2016-01-04 09:30:19 104.3 1500 156450 1 15: 2016-01-04 09:30:20 104.4 500 52200 1 16: 2016-01-04 09:30:21 104.4 1500 156600 1 17: 2016-01-04 09:30:22 104.4 1000 104400 1 18: 2016-01-04 09:30:24 104.4 1500 156600 1 19: 2016-01-04 09:30:25 104.0 2000 208000 0 20: 2016-01-04 09:30:27 104.1 3500 364350 1

, 내가 Price의 다른 수준에 따라 Volume의 분포를 구축하고 싶습니다 : 참조 데이터 Find which interval row in a data frame that each element of a vector belongs inSplit a vector into chunks in R

이루어집니다.

구체적 :

  1. 나누기 N 개/방식으로 Price의 범위 (예를 들어, N = 5) 다른 빈들

위한

  • 정리해 Volume I는 split 함수 시도 패키지에 cut_number 등의 기능이 몇개인가 있습니다. 그리고 내가 생각 findInterval 도움이 될 수 있으며 코드는 다음과 같이해야합니다 :

    library(data.table) 
    dt[, sum(Volume), by = findInterval(Price,cut_number(Price, 5))] # Do not work 
    # I think the key should be in `by` part. 
    dt[, sum(Volume), by = some functions here] 
    

    재현 데이터

    (으로 만)
    dt <- data.table(structure(list(Time 
        = structure(c(1451898306, 1451899200, 
        1451899800,1451899801, 1451899802, 
        1451899805, 1451899806, 1451923195, 
        1451923196,1451923200), class = 
        c("POSIXct", "POSIXt"), tzone = 
        "GMT"),Price = c(105, 104.1, 
        104.1, 103.9, 104.1, 104, 104.1, 103,102.9, 102.9), 
        Volume = c(9500L, 23500L, 18500L, 
        12500L,16118L, 13000L, 2500L, 4000L, 2000L, 1000L), 
        Amount = c(993700L,2446350L, 
        1924550L, 1300550L, 1675233L, 1352200L, 260100L,412000L, 206016L, 102880L), 
        Flag = c(1L, 0L, 1L, 0L, 1L,0L, 
        1L, 1L, 0L, 1L)), .Names = c("Time", 
        "Price", "Volume","Amount", 
        "Flag"), class = c("data.table", 
        "data.frame"), row.names = c(NA,-10L))) 
    

    원하는 출력 : 또한

    Price Range Sum 
    102.3 - 102.5 300000 
    . 
    . (Total N bins, thus N rows) 
    . 
    105.0 - 105.3 500000 
    

    내가 시도 몇 가지 다른 조합은 모두 실패했습니다.

    모든 의견을 환영합니다! 고마워.

  • 답변

    1

    N은 빈당 개수이며 행 수는 아니라고 가정합니다. 인덱스를 만들지 않으면 아마도 더 짧은 방법 일 것입니다. 그러나 여기 먼저하고 영업 이익의 의견

    당신이 동일한 폭의 밴드를 원하는 경우에

    을 한 후

    setorder(dt, Price) 
    dt[,GROUP:=ceiling(seq_along(Price)/5)][, 
        list(PriceRange=paste(range(Price), collapse=" - "), 
         Volume=sum(Volume)), 
        by="GROUP"] 
    

    편집을 요약하면 그룹 하나입니다, 당신은이를 사용할 수 있습니다

    dt[, sum(Volume), by=cut(Price, 5)] 
    

    모든 밴드를 표시하려면 다음을 사용하십시오.

    dt[,Band:=cut(Price, 5)] 
    dt[dt[, list(Band=levels(Band))], on="Band"][, sum(Volume, na.rm=TRUE), by="Band"] 
    

    HTH

    +0

    감사합니다. @ chinsoon12, 귀하의 게시물에서 N은 빈당 숫자 (즉, 표본 크기)를 나타냅니다. 사실 프로그래밍의 맥락에서 N은 빈의 수를 의미합니다. 전체 인구를 상자로 균등하게 나눌 필요가 없습니다. 이 경우에 대한 아이디어를 제공해 줄 수 있습니까? 고마워요! – Bigchao