You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

R语言基于唯一ID对应索引列值顺序筛选数据集的实现方法

R语言实现方案如下:

核心处理逻辑

  • 先剔除index为NA的无效行,再按ID分组校验两个筛选条件:
  1. 同ID下index的唯一取值数量≥2
  2. 排序后的唯一index存在相邻差值为1的连续递增序列
  • 最后过滤掉同ID下不属于连续序列的行,即可得到预期结果

dplyr实现(代码简洁易读,适合大部分场景)

# 加载依赖包
library(dplyr)

df_new <- df %>%
  # 剔除index为NA的无效行
  filter(!is.na(index)) %>%
  # 按ID分组处理
  group_by(ID) %>%
  # 筛选符合要求的ID:index唯一值≥2,且存在连续递增序列
  filter(n_distinct(index) >= 2, any(diff(sort(unique(index))) == 1)) %>%
  # 仅保留属于连续序列的index行
  filter((index - lag(index, default = -Inf) == 1 | (lead(index, default = Inf) - index == 1) %>%
  ungroup() %>%
  # 按ID升序排列,匹配示例输出顺序
  arrange(ID)

base R实现(无额外包依赖)

# 剔除NA行
df_clean <- df[!is.na(df$index), ]
# 按ID拆分数据
df_split <- split(df_clean, df_clean$ID)
# 筛选符合条件的ID
keep_id <- sapply(df_split, function(x) {
  unique_idx <- sort(unique(x$index))
  length(unique_idx) >=2 && any(diff(unique_idx) == 1)
})
df_keep <- df_clean[df_clean$ID %in% names(which(keep_id)), ]
# 过滤非连续序列的行
df_new <- do.call(rbind, lapply(split(df_keep, df_keep$ID), function(x) {
  x <- x[order(x$index), ]
  keep <- (x$index - c(-Inf, x$index[-nrow(x)])) == 1 | (c(x$index[-1], Inf) - x$index == 1
  x[keep, ]
}))
rownames(df_new) <- NULL
# 按ID排序
df_new <- df_new[order(df_new$ID), ]

运行上述任意一套代码均可得到和示例完全一致的输出结果。

内容的提问来源于stack exchange,提问作者Chris Rodriguez

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.04 06:15:01