如何计算一个变量的平均值,条件是另一个变量的分位数分裂?

时间:2017-04-03 21:48:43

标签: r dataframe data.table

以下是问题:

  1. 条件时间将一个变量(X)拆分为十分位数,即10个分位数
  2. 计算X的分位数和时间
  3. 上另一个变量(Y)条件的任意平均值

    这是假数据:

    df.setTimeZone()

    以下是分位数分割:

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

    Time和Quantile的Grouped值条件似乎很清楚

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

    或者

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

    问题是如何在所有X的顶部获得任意平均Y,条件,例如10,9,8或底部1,2,3分位数

    任何帮助都很赞赏!

2 个答案:

答案 0 :(得分:2)

在这里你想要的并不完全清楚。如果你想要分数8到10的均值,你可以这样做:

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等,则可以选择以下选项:< / p>

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
# ...

答案 1 :(得分: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")]