使用R语言tidyverse查找满足连续收敛条件的分组图像索引
用tidyverse查找首个连续5次收敛的图像索引
针对你的需求,我们可以通过tidyverse的分组计算,快速定位每个Image_series_names组内第一个满足「当前及后续4个Convergence_type均为convergence」的Image_number。
方法一:使用slider包(滑动窗口更简洁)
先加载所需包:
library(tidyverse) library(slider)
处理数据的代码逻辑:
result_df <- df %>% # 按图像系列分组 group_by(Image_series_names) %>% # 将收敛状态转为数值标记(1=收敛,0=未收敛) mutate(converge_flag = as.integer(Convergence_type == "convergence")) %>% # 计算当前位置及后续4个位置的标记和,仅保留完整窗口的结果 mutate(consecutive_sum = slide_sum(converge_flag, .before = 0, .after = 4, .complete = TRUE)) %>% # 筛选出连续5次收敛的行 filter(consecutive_sum == 5) %>% # 取每组第一个符合条件的记录 slice_head(n = 1) %>% # 重命名结果列并保留关键信息 select(Image_series_names, first_converge_image = Image_number) %>% # 确保所有图像系列都被保留,无符合条件的填充NA right_join(df %>% distinct(Image_series_names), by = "Image_series_names") %>% # 取消分组 ungroup()
方法二:仅用dplyr(无需额外包)
如果不想依赖slider包,可以用lead函数手动判断连续状态:
result_df <- df %>% group_by(Image_series_names) %>% mutate( # 判断当前及后续4个状态是否均为收敛,最后几个位置用默认值避免NA干扰 is_consecutive = Convergence_type == "convergence" & lead(Convergence_type, 1, default = "no_convergence") == "convergence" & lead(Convergence_type, 2, default = "no_convergence") == "convergence" & lead(Convergence_type, 3, default = "no_convergence") == "convergence" & lead(Convergence_type, 4, default = "no_convergence") == "convergence" ) %>% filter(is_consecutive) %>% slice_head(n = 1) %>% select(Image_series_names, first_converge_image = Image_number) %>% right_join(df %>% distinct(Image_series_names), by = "Image_series_names") %>% ungroup()
两种方法最终都会返回包含所有76个图像系列的结果集,first_converge_image列对应首个满足连续5次收敛的图像编号,无符合条件的系列会显示NA。
内容的提问来源于stack exchange,提问作者fgardavaud
相关产品推荐
相关产品推荐

