R语言基于唯一ID对应索引列值顺序筛选数据集的实现方法
R语言实现方案如下:
核心处理逻辑
- 先剔除index为NA的无效行,再按ID分组校验两个筛选条件:
- 同ID下index的唯一取值数量≥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
相关产品推荐
相关产品推荐

