在R中提取重复测量数据中指定标记行及前后特定行
解决方案
假设你的数据框名为df,包含boar_id(公猪ID)、measurement_ID(连续测量ID)、reject(标记列)等字段,可通过以下步骤实现需求:
- 按公猪分组并按
measurement_ID排序,确保每组内数据按测量顺序排列 - 标记出每组中
reject == "blood"的行位置 - 筛选出所有落在目标行前1行到后3行范围内的记录
代码实现
library(dplyr) final_df <- df %>% # 按公猪分组处理 group_by(boar_id) %>% # 组内按measurement_ID升序排列,保证顺序正确 arrange(measurement_ID, .by_group = TRUE) %>% mutate( # 生成组内行号,用于定位 row_idx = row_number(), # 提取当前组中所有reject为"blood"的行的位置 blood_rows = which(reject == "blood"), # 判断当前行是否在目标范围内:行号处于任意blood行的[-1, +3]区间 to_keep = sapply(row_idx, function(x) any(between(x, blood_rows - 1, blood_rows + 3))) ) %>% # 筛选需要保留的行 filter(to_keep) %>% # 移除临时辅助列 select(-row_idx, -blood_rows, -to_keep) %>% ungroup()
关键说明
- 必须先按
boar_id分组再排序,确保每个公猪的测量数据是连续有序的 - 用
row_number()生成组内相对位置,替代日期作为排序依据,避免日期格式问题 between()函数自动处理边界情况:比如目标行是组内第一行时,不会错误提取不存在的前1行;目标行是组内最后几行时,仅提取存在的后续行
内容的提问来源于stack exchange,提问作者Zklr
相关产品推荐
相关产品推荐

