2017-04-03 73 views
0

這裏是這樣的問題:如何計算一個變量的平均值,以另一個變量的分位數分割爲條件?

  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))) 
    

    這裏是位數分裂:

    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 
    

    如果你想創建一個新的data.table與位數11:21:31:4等,其中一個方案是:

    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 =。(時間,分位數<= 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

    相關問題