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

使用dplyr查找某值在另一值之后的首次出现行

解决方法:用dplyr筛选巢箱被占用后首次空置的记录

嗨,我来帮你搞定这个需求!你需要针对每个巢箱,找出它被占用后首次变为空置的那一行记录,用dplyr可以很清晰地实现这个逻辑。

步骤说明

核心思路是按巢箱分组,然后识别出状态从Occupied切换到Empty的第一个实例,同时排除那些从未被占用过的巢箱。

完整代码实现

首先加载dplyr包(如果还没安装的话先运行install.packages("dplyr")):

library(dplyr)

然后处理你的数据集:

# 你的原始数据集
dat <- structure(list(NestID = c("WA18", "WA18", "WA18", "WA18", "WA18", "WA18", "WA18", "WA18", "WA18", "WA20", "WA20", "WA20", "WA20", "WA20", "WA20", "WA20", "WA20", "WA20", "WA20", "WA20"), Date = structure(c(17928, 17929, 17930, 17931, 17932, 17933, 17934, 17935, 17936, 17555, 17556, 17557, 17558, 17559, 17560, 17561, 17562, 17563, 17564, 17565), class = "Date"), Status = c("Empty", "Empty", "Empty", "Occupied", "Occupied", "Occupied", "Empty", "Empty", "Empty", "Empty", "Empty", "Empty", "Empty", "Empty", "Empty", "Occupied", "Occupied", "Empty", "Empty", "Empty")), class = c("tbl_df", "tbl", "data.frame"), row.names = c(NA, -20L))

# 筛选目标记录
result <- dat %>%
  # 按巢箱分组,确保每个巢箱独立处理
  group_by(NestID) %>%
  # 标记该巢箱是否有过被占用的记录,过滤从未被占用的巢箱
  mutate(has_occupied = any(Status == "Occupied")) %>%
  # 筛选:有过占用记录 + 当前状态是Empty + 上一行状态是Occupied(刚从占用变空)
  filter(has_occupied, Status == "Empty", lag(Status) == "Occupied") %>%
  # 每个巢箱只保留第一个符合条件的行(首次变空)
  slice_head(n = 1) %>%
  # 移除临时标记列
  select(-has_occupied) %>%
  # 取消分组
  ungroup()

# 查看结果
result

运行结果

执行后你会得到如下输出,正好符合你的需求:

# A tibble: 2 × 3
  NestID Date       Status
  <chr>  <date>     <chr> 
1 WA18   2019-02-07 Empty 
2 WA20   2017-10-19 Empty

代码逻辑拆解

  • group_by(NestID):将数据按巢箱ID分组,保证每个巢箱的处理独立进行。
  • mutate(has_occupied = any(Status == "Occupied")):添加一个临时列,标记该巢箱是否出现过Occupied状态,避免筛选出从未被占用的巢箱。
  • filter(...):精准定位目标行——必须是有过占用记录的巢箱,当前状态为Empty,且上一行状态是Occupied(也就是第一次从占用切换到空置的瞬间)。
  • slice_head(n = 1):每个巢箱只保留第一个符合条件的行,确保是首次变空的记录。
  • select(-has_occupied):移除临时添加的标记列,让结果更整洁。
  • ungroup():取消分组,将结果转换为普通的tibble格式。

这个方法还能处理边界情况:如果某个巢箱最后状态还是Occupied(没有后续的空置记录),它不会出现在结果里,完全符合你的业务需求。

内容的提问来源于stack exchange,提问作者Jason

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.12 03:58:19