在R的data.table中基于指定子组拟合ecdf并计算分位数
解决方案
可以通过在data.table的分组计算中,先筛选指定子组的value来拟合ecdf,再将该函数应用到当前分组的所有行,实现需求。具体代码如下:
library(data.table) set.seed(101) dt <- data.table( group = c(rep("A",3),rep("B",3),rep("C",3), rep("D",3)), date = rep(as.Date(19000:19002, origin = "1970-01-01"),4), value = rnorm(12) ) # 按date分组,仅用group为A/B/C的value拟合ecdf,再计算所有行的百分位数 dt[, Percentile := ecdf(value[group %in% c("A","B","C")])(value), by = date] # 查看结果 dt
代码说明
by = date:按日期分组处理每个日期的数据value[group %in% c("A","B","C")]:在每个日期分组内,仅提取group属于指定子组的value数据,用于拟合经验分布函数ecdf()ecdf(...) (value):将拟合好的分布函数应用到当前日期分组的所有value(包括D组),得到对应的百分位数
输出结果
运行代码后会得到你期望的结果:
group date value Percentile 1: A 2022-01-08 -0.3260365 0.3333333 2: A 2022-01-09 0.5524619 1.0000000 3: A 2022-01-10 -0.6749438 0.3333333 4: B 2022-01-08 0.2143595 0.6666667 5: B 2022-01-09 0.3107692 0.6666667 6: B 2022-01-10 1.1739663 1.0000000 7: C 2022-01-08 0.6187899 1.0000000 8: C 2022-01-09 -0.1127343 0.3333333 9: C 2022-01-10 0.9170283 0.6666667 10: D 2022-01-08 -0.2232594 0.3333333 11: D 2022-01-09 0.5264481 0.6666667 12: D 2022-01-10 -0.7948444 0.0000000
内容的提问来源于stack exchange,提问作者Chris437
相关产品推荐
相关产品推荐

