如何用dplyr等工具筛选同日期下场景a、b值均<300的实例
用dplyr筛选同一日期下场景a和b的value均小于300的数据
嘿,我来帮你搞定这个数据筛选的需求!你想要找出同一日期下场景a和场景b对应的value都小于300的数据,用dplyr完全可以轻松实现,我给你一步步讲清楚~
首先,你提供的原始数据有点不完整(日期列截断、缺少value字段),我先补全成可运行的示例数据,方便你跟着操作:
library(tidyverse) library(lubridate) # 构建完整的示例数据集 set.seed(123) # 固定随机种子,保证结果可重复 scenario <- rep(c("a", "b"), each = 14) str_tstep <- seq(mdy("2/29/1924"), by = "month", length.out = 14) %>% as.character() value <- sample(200:400, 28, replace = TRUE) # 生成200-400之间的随机value # 转换日期格式,生成标准数据框 df <- tibble(scenario, str_tstep = mdy(str_tstep), value)
接下来给你两种实用的dplyr实现方法:
方法一:先转宽表再筛选
这种方法先把长格式数据转成宽格式,让同一日期的a、b场景value处于同一行,然后直接筛选两个value都小于300的行:
# 转宽表,同一日期的a和b value在一行 df_wide <- df %>% pivot_wider(names_from = scenario, values_from = value, names_prefix = "value_") %>% filter(value_a < 300, value_b < 300) # 如果需要转回长格式,加下面这步 df_wide %>% pivot_longer( cols = starts_with("value_"), names_to = "scenario", values_to = "value", names_prefix = "value_" )
方法二:分组后直接逻辑筛选
这种方法不用转换数据格式,直接按日期分组,检查每个日期下的a、b场景是否都满足value<300:
df_filtered <- df %>% group_by(str_tstep) %>% # 可选:确保每个日期同时存在a和b场景(如果你的原始数据都满足,可省略) filter(all(scenario %in% c("a", "b"))) %>% # 检查当前日期下所有value都小于300(因为每个分组只有a、b两个场景,等价于两者都<300) filter(all(value < 300)) %>% ungroup()
关键步骤解释:
group_by(str_tstep):把数据按日期分组,实现对单个日期的数据独立处理all(value < 300):因为每个分组里只有a、b两个场景的value,所以这个条件就等价于该日期下a和b的value都小于300
如果你的原始数据里每个日期都同时存在a和b场景,第二种方法会更简洁高效哦~
内容的提问来源于stack exchange,提问作者dbo
相关产品推荐
相关产品推荐

