求R语言实现两列交叉分步筛选的函数方案
R语言实现两步交叉筛选方案
需求说明
实现两步交叉筛选:
- 第一步:找出数据集中C列值存在于F列,或F列值存在于C列的行,提取这些行的D列值(去重后得到目标值集合);
- 第二步:筛选出A列值属于上述目标值集合的行,最终可保留全部列或仅保留A、B、C列。
原始数据
# 构造原始数据集 data <- data.frame( A = c("FFFFFi", "Second", "rowA", "Fecond", "Hecond", "rowB"), B = c("ro1", "ro3", "ro3", "ro3", "ro3", "ro3"), C = c("rowF", "rowH", "row", "", "", ""), D = c("rowA", "rowA", "rowA", "rowB", "rowB", "rowB"), F = c("rowE", "rowF", "rowG", "rowH", "rowT", "rowX"), stringsAsFactors = FALSE )
对应的表格展示:
| A | B | C | D | F |
|---|---|---|---|---|
| FFFFFi | ro1 | rowF | rowA | rowE |
| Second | ro3 | rowH | rowA | rowF |
| rowA | ro3 | row | rowA | rowG |
| Fecond | ro3 | rowB | rowH | |
| Hecond | ro3 | rowB | rowT | |
| rowB | ro3 | rowB | rowX |
实现步骤
方法1:基础R实现
# 第一步:获取C列与F列的交集值,筛选出包含该值的行,提取D列目标值(去重) common_values <- intersect(data$C, data$F) filter_step1 <- data[data$C %in% common_values | data$F %in% common_values, ] target_d <- unique(filter_step1$D) # 第二步:筛选A列匹配target_d的行 result_full <- data[data$A %in% target_d, ] # 仅保留A、B、C列 result_ab_c <- result_full[, c("A", "B", "C")]
方法2:dplyr包实现(简洁语法)
如果习惯用tidyverse生态,可使用dplyr:
library(dplyr) # 完整列结果 result_full <- data %>% # 标记C/F列包含交集值的行,提取对应的D值集合 {filter(data, A %in% unique(.$D[.$C %in% intersect(.$C, .$F) | .$F %in% intersect(.$C, .$F)]))} # 仅保留A、B、C列 result_ab_c <- result_full %>% select(A, B, C)
运行结果
完整列结果
| A | B | C | D | F |
|---|---|---|---|---|
| rowA | ro3 | row | rowA | rowG |
| rowB | ro3 | rowB | rowX |
仅保留A、B、C列结果
| A | B | C |
|---|---|---|
| rowA | ro3 | row |
| rowB | ro3 |
补充说明
- 若需求仅为单向匹配(仅筛选C列值存在于F列的行),可将第一步条件改为
data$C %in% data$F,但此逻辑无法得到预期结果中的rowB行,需根据实际需求调整; - 使用
unique()去重是为了避免重复筛选,提升代码效率。
内容的提问来源于stack exchange,提问作者Gerardo Rey Garcia
相关产品推荐
相关产品推荐

