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

R语言如何按规则筛选数据:同id优先保留v列VDS行否则保留V6行

R数据按ID优先保留VDS行筛选实现方法

首先给出示例数据集构建代码:

id <-c ("A1", "A2", "A3", "A3", "A4", "A5", "A6", "A6", "A7")
v <-c ("V6", "V6", "V6", "VDS", "V6", "V6", "V6", "VDS", "V6")
s <- c("nr", "r", "nr", "nr", "r", "r", "nr", "r", "nr")
i <- c("A", "B", "C", "D", "E", "F", "G", "H", "I")
data <- data.frame(id,v,s,i)

筛选规则说明

对id列的每个唯一值:

  • 若该id对应v列存在取值为VDS的行,仅保留该VDS对应的行
  • 若该id对应v列不存在VDS值,保留v列取值为V6的行
    最终保证id列无重复值

实现方法

方法1:dplyr包(tidyverse生态常用写法)

核心逻辑为按id分组后,将同组内VDS行排序到最前,取每组第一行即可满足筛选要求:

library(dplyr)

filter_result <- data %>%
  group_by(id) %>%
  # 同组内VDS行优先级高于V6,排序后放在最前
  arrange(desc(v == "VDS"), .by_group = TRUE) %>%
  # 取每组第一行
  slice(1) %>%
  ungroup()

方法2:基础R实现(无需安装额外包)

核心逻辑为给每行设置优先级,VDS优先级高于V6,按id分组后取每组优先级最高的行:

# 新增优先级列,VDS赋值为2,V6赋值为1
data$priority <- ifelse(data$v == "VDS", 2, 1)
# 按ID分组取优先级最高的行
filter_result <- data[ave(data$priority, data$id, FUN = function(x) x == max(x)) == TRUE, ]
# 删除辅助生成的优先级列
filter_result$priority <- NULL

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.01 00:27:00