You need to enable JavaScript to run this app. R语言如何基于前序行New_ID.1列值过滤对应New_ID数据行
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.21 08:24:05