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
相关产品推荐
相关产品推荐

