在R中计算各站点最新评估方法启用后的结果均值
问题描述
我有一个名为Merged的大型DataFrame,包含数千行、20列,每行对应一条站点访问记录,涉及400个站点。每个站点有多条不同月份的访问记录,且部分站点的评估方法(Method)可能在年内变更。示例数据如下:
| Site | Date | Method | Result |
|---|---|---|---|
| 2200 | 21/06/2021 | 24 | 0.22 |
| 2201 | 03/07/2021 | 21 | 0.01 |
| 2203 | 03/07/2021 | 21 | 0.02 |
| 2200 | 01/08/2021 | 21 | 0.05 |
| 2201 | 03/08/2021 | 21 | 0.01 |
| 2203 | 03/08/2021 | 21 | 0.02 |
| 2200 | 01/09/2021 | 21 | 0.05 |
此前我用以下代码计算各站点Result的均值:
OPmean <- aggregate(Merged$Result, list(Merged$Site), FUN=mean, na.rm = TRUE)
现在需求变更为:仅计算各站点最新评估方法首次启用后的Result均值。比如站点2200,评估方法在2021年8月变更为21并保持至今,需要计算该日期之后所有数据点的均值。
具体需求步骤:
- 识别每个站点的最新评估方法;
- 确定该方法首次使用的日期;
- 计算该日期之后所有数据点的
Result均值。
我尝试用以下代码判断站点是否变更过评估方法,但无法确定变更时间,也不知道如何筛选数据计算目标均值:
method <- aggregate(Merged$Method, list(Merged$Site), FUN=mean, na.rm = TRUE) ch<- method %>% mutate( change = case_when( x == 21.00000 ~ "No", x == 24.00000 ~ "No", x != 24.00000 |21.00000 ~ "Yes" ) )
测试数据:
Site <- c("2200", "2201", "2203", "2200", "2201", "2203", "2200" ) date <- c("21/06/2021", "03/07/2021", "03/07/2021", "01/08/2021", "03/08/2021", "03/08/2021", "01/09/2021" ) Method <- c("24", "21", "21", "21", "21", "21", "21") Result <- c(0.22, 0.01, 0.02, 0.05, 0.01, 0.02, 0.02) Date<- as.Date(date, "%d/%m/%Y") Merged <- data.frame(Site, Date, Method, Result)
解决方案
可以用dplyr包的分组操作完成需求,步骤如下:
- 按
Site分组,先获取每个站点的最新方法(即该站点最后一条记录的Method); - 在每个站点内,筛选出所有使用最新方法的记录,取其中最早的日期作为基准日期;
- 筛选出每个站点中日期晚于等于基准日期的所有记录,计算
Result的均值。
完整代码:
library(dplyr) # 确保Date是日期类型(如果你的数据还没转换) Merged <- Merged %>% mutate(Date = as.Date(Date, "%d/%m/%Y")) # 计算目标均值 latest_method_mean <- Merged %>% group_by(Site) %>% arrange(Date) %>% # 按日期升序排序,确保最新记录在最后 mutate(latest_method = last(Method)) %>% # 筛选出当前站点使用最新方法的所有记录,找到首次使用日期 filter(Method == latest_method) %>% mutate(first_latest_method_date = min(Date)) %>% # 筛选出基准日期之后的记录 filter(Date >= first_latest_method_date) %>% # 计算均值 summarise(mean_result = mean(Result, na.rm = TRUE)) %>% ungroup() print(latest_method_mean)
运行测试数据后,输出结果为:
# A tibble: 3 × 2 Site mean_result <chr> <dbl> 1 2200 0.04 2 2201 0.01 3 2203 0.02
代码说明
arrange(Date):确保每个站点的记录按日期升序排列,这样last(Method)就能准确获取最新的评估方法;min(Date):在筛选出使用最新方法的记录后,提取该方法首次启用的日期;- 最后筛选出基准日期及之后的所有记录,用
mean()计算Result的均值。
内容的提问来源于stack exchange,提问作者Dani.Elizabeth
相关产品推荐
相关产品推荐

