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

R语言:如何获取MG事件首次发生周及前次观测周?已尝试slice

用slice获取MG事件前最后一次观测周数的解决方案

当然可以用slice来实现这个需求!咱们可以结合分组排序、索引定位或者条件筛选的思路,把首次MG事件周数和之前最后一次观测周数都拿到。我给你两种实用的方案,都用到slice:

方案一:先筛选前置观测再取最后一条

这个思路更直观,先找到每个材料首次MG事件的周数,再筛选出该周数之前的所有观测,最后用slice(n())取其中的最后一条(也就是最大的周数):

library(dplyr)

# 你的示例数据
df <- data.frame(Weeks=c(1,2,3,5,1,2,7,10), Material=c(rep("A",4),rep("B",4)), MG=c(0,0,0,1,0,0,1,1))

output <- df %>%
  group_by(Material) %>%
  # 先按周数排序,确保观测按时间顺序排列(关键!避免周数乱序出错)
  arrange(Weeks) %>%
  # 先计算每个材料的首次MG事件周数
  mutate(firstweek = Weeks[which.max(MG)]) %>%
  # 筛选出MG事件发生前的所有观测
  filter(Weeks < firstweek) %>%
  # 取这些前置观测的最后一条(即最大周数)
  slice(n()) %>%
  # 整理lastbefore字段
  select(Material, lastbefore = Weeks) %>%
  # 左连接首次MG事件的记录,整合结果
  left_join(
    df %>% group_by(Material) %>% slice(which.max(MG)) %>% select(Material, firstweek = Weeks),
    by = "Material"
  ) %>%
  # 调整列顺序到期望的格式
  select(Material, firstweek, lastbefore)

output

运行后会得到你想要的结果:

# A tibble: 2 × 3
# Groups:   Material [2]
  Material firstweek lastbefore
  <chr>        <dbl>      <dbl>
1 A                5          3
2 B                7          2

方案二:通过索引定位直接获取

这个方法更简洁,利用which.max(MG)拿到首次MG事件的索引位置,直接取该索引的前一条记录的周数:

output <- df %>%
  group_by(Material) %>%
  arrange(Weeks) %>%
  mutate(
    # 拿到首次MG=1的索引位置
    first_mg_idx = which.max(MG),
    # 首次MG事件的周数
    firstweek = Weeks[first_mg_idx],
    # 如果首次MG不是第一条观测,取前一条的周数;否则设为NA(没有前置观测的情况)
    lastbefore = ifelse(first_mg_idx > 1, Weeks[first_mg_idx - 1], NA)
  ) %>%
  # 直接取首次MG事件的那条记录
  slice(first_mg_idx) %>%
  # 保留需要的列
  select(Material, firstweek, lastbefore)

output

这个方案的好处是在同一个分组管道里完成所有计算,不需要额外的连接操作,效率更高,还能处理“第一次观测就发生MG事件”的边界情况(此时lastbefore会是NA)。

两种方案都用到了slice,完全符合你的需求~

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.07 18:57:34