R语言如何基于前序行New_ID.1列值过滤对应New_ID数据行
实现方案
你需要的逻辑是遍历过程中仅维护已保留行的New_ID.1值集合,单次遍历即可完成过滤,不需要反复生成新表重处理,时间复杂度为O(n),效率远高于你最初设想的循环重处理方案。
Tidyverse 实现(依赖purrr包)
library(tidyverse) # 逐行累积维护已保留行的New_ID.1集合,生成保留标记 keep_flag <- accumulate( .x = 1:nrow(orig_df), .init = integer(0), .f = \(used_ids, row_idx) { current_new_id <- orig_df$New_ID[row_idx] if (!current_new_id %in% used_ids) { c(used_ids, orig_df$New_ID.1[row_idx]) } else { used_ids } } ) |> # 去掉.init的初始空值,对比前后集合长度变化判断是否保留当前行 tail(-1) |> map_lgl(\(x) length(x) != length(lag(x, default = integer(0)))) # 过滤得到结果 result <- orig_df[keep_flag, ]
运行后result与你给出的output_table完全一致。
无依赖基础R实现
used_new_id1 <- integer(0) keep_row_index <- integer(0) for (i in seq_len(nrow(orig_df))) { current_new_id <- orig_df$New_ID[i] # 仅保留New_ID未出现在已保留行的New_ID.1中的行 if (!current_new_id %in% used_new_id1) { keep_row_index <- c(keep_row_index, i) used_new_id1 <- c(used_new_id1, orig_df$New_ID.1[i]) } } result <- orig_df[keep_row_index, ]
逻辑说明
- 初始状态下
used_new_id1为空集合 - 逐行判断当前行的
New_ID是否在used_new_id1中:- 不在则保留该行,同时将该行的
New_ID.1加入used_new_id1 - 在则直接跳过,不修改
used_new_id1
- 不在则保留该行,同时将该行的
- 该逻辑天然满足你的需求:被过滤行的
New_ID.1不会加入集合,不会影响后续行的判断
内容的提问来源于stack exchange,提问作者jsimpsno
相关产品推荐
相关产品推荐

