基于分组DataFrame用dplyr和ecdf计算流量值的百分位数
解决方案
你可以通过按站点分组生成ECDF函数,再将其与df1关联计算每个Flow值的百分位数,具体步骤如下:
1. 加载所需包
确保安装并加载dplyr和purrr(用于处理列表与映射操作):
library(dplyr) library(purrr)
2. 生成各站点的ECDF函数
从df2中按站点提取流量序列,为每个站点创建对应的经验累积分布函数(ECDF):
site_ecdf <- df2 %>% group_by(Site_ID) %>% summarise(ecdf_function = list(ecdf(Flow)))
3. 关联df1并计算百分位数
将生成的ECDF函数与df1按站点关联,遍历每个Flow值代入对应站点的ECDF函数,得到百分位数(乘以100转换为百分比形式):
final_result <- df1 %>% left_join(site_ecdf, by = "Site_ID") %>% mutate( Percentile = map2_dbl(Flow, ecdf_function, ~ .y(.x) * 100) ) %>% select(-ecdf_function) # 移除临时函数列
代码说明
ecdf(Flow)生成的函数,输入某个Flow值时会返回该值在对应站点流量序列中的累积概率(范围0-1);map2_dbl用于逐行匹配df1的Flow值和对应站点的ECDF函数,批量计算结果并返回数值向量;- 最终结果保留df1所有原始列,新增
Percentile列表示该Flow值在对应站点流量序列中的百分位数。
示例输出
运行代码后,final_result的结构示例如下:
# A tibble: 9 × 4 Event Site_ID Flow Percentile <chr> <chr> <dbl> <dbl> 1 1 a 2.12 60.0 2 2 a 1.89 45.0 3 3 a 2.56 80.0 4 4 b 1.72 30.0 ...
内容的提问来源于stack exchange,提问作者James White
相关产品推荐
相关产品推荐

