You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 04:19:45