2017-04-03 1 views
0

여기서 질문입니다 :하나의 변수의 평균값을 계산하는 방법 다른 변수의 quantile split에서 조건부 변수를 조건부로 계산하는 방법은 무엇입니까?

시간에
  1. 조건 즉, 분위로 하나 개의 변수 (X)를 분할 10 분위수
  2. X의 분위수 및 시간
을 다른 변수 (Y) 상태의
  • 계산 임의의 평균 여기

    library(data.table) 
        set.seed(1) 
        dat = as.data.table(data.frame(X = round(abs(rnorm(100))*100,2), 
        Time = rep(seq(as.Date("2016-01-01"),as.Date("2016-04-01"),"month"),25), 
        Y = round(rnorm(100),2))) 
    

    가 분위수 스플릿이다 :

    ,536,913 여기

    가짜 데이터 인 63,210

    dat[, ':=' (Quantile = dplyr::ntile(X,10)),by = Time][] 
    

    두 시간에 그룹화 된 값의 상태와 분위수는 아주 명확 보인다

    dat[,`:=` (MeanY = mean(Y)),by = c("Time","Quantile")] 
    

    또는

    dat[, MeanY = mean(Y) ,by = c("Time","Quantile")] 
    

    문제는 내가 모든 X의 상단에, 조건을 임의의 평균 Y를 얻을 수있는 방법이다, 10,9,8 또는 아래 1,2,3 분위와 같은

    위대한 도움을 주셨습니다!

  • 답변

    2

    여기에서 원하는 내용이 완전히 명확하지 않습니다. 당신이 10를 통해 단지 분위 8 평균을 원한다면, 당신은 할 수 :

    dat[Quantile %in% 8:10, list(MeanY = mean(Y)), by = Time] 
    #   Time  MeanY 
    # 1: 2016-01-01 -0.2471429 
    # 2: 2016-04-01 -0.5185714 
    # 3: 2016-03-01 -0.5085714 
    # 4: 2016-02-01 -0.5700000 
    

    는 등 분위 1, 1:2, 1:3, 1:4와 새로운 data.table을 만들고 싶었 경우, 하나의 옵션은 다음과 같습니다

    library(purrr) 
    map_df(1:10, function(q) dat[Quantile %in% 1:q, 
        list(TopN = paste0("1:", q), MeanY = mean(Y)), by = Time]) 
    #   Time TopN  MeanY 
    # 1: 2016-04-01 1:1 -0.03000000 
    # 2: 2016-01-01 1:1 -0.58333333 
    # 3: 2016-03-01 1:1 0.25000000 
    # 4: 2016-02-01 1:1 0.10666667 
    # 5: 2016-01-01 1:2 -0.86200000 
    # ... 
    
    +0

    감사합니다! 그것은 내 잘못이야! 나는 Top3에서 Bottom3 빼기의 차이점을 효율적으로 원한다. – user1730977

    +1

    두 번째 것은 data.table만을 사용하고, dat [CJ (Time = Time, q = 1:10, unique = TRUE), on =. 시간, Quantile <= q), 평균 (Y), by = .EACHI]' – Frank

    1

    당신은 카테고리를 만든 다음 범주의 평균 계산할 수 :

    dat[, `:=` (quant_cat = dplyr::case_when(Quantile >= 8 ~ "top", 
                 Quantile <= 3 ~ "middle", 
                 Quantile > 3 | Quantile < 8 ~ "middle")) 
        ][, `:=` (MeanY = mean(Y)), by = c("Time", "quant_cat")] 
    
    +0

    너보다 훨씬! 그게 내가 원하는거야! – user1730977

    관련 문제