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
相关产品推荐
相关产品推荐

