以下是问题:
这是假数据:
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分位数
任何帮助都很赞赏!
答案 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
,其中包含分位数1
,1:2
,1:3
,1: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")]