如何根据列表中的列名与值筛选data.frame的行索引?
问题:基于列表中的列名和对应值筛选data.frame的行索引
数据准备
首先创建目标data.frame:
mydf <- data.frame( LETTERS = LETTERS, rev_letters = rev(letters), var1 = c(rep('a',10), rep('b',10), rep('c',6)), value = 1:26 ) # 查看前6行 head(mydf) # 输出: # LETTERS rev_letters var1 value # 1 A z a 1 # 2 B y a 2 # 3 C x a 3 # 4 D w a 4 # 5 E v a 5 # 6 F u a 6
筛选条件列表
定义包含列名和对应筛选值的列表:
mylist <- list( LETTERS = c('A','M','X'), var1 = 'b' ) # 查看列表内容 mylist # 输出: # $LETTERS # [1] "A" "M" "X" # # $var1 # [1] "b"
需求说明
需要筛选出满足mylist中任意一个条件的行,即:
LETTERS列值为A/M/X,或var1列值为b
预期结果:
- 行索引:
[1] 1 11 12 13 14 15 16 17 18 19 20 24 - 对应逻辑向量:
[1] TRUE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE TRUE TRUE [13] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE FALSE FALSE FALSE TRUE [25] FALSE FALSE
解决方案
方法1:基础R实现
利用Map生成每个条件的逻辑向量,再通过Reduce合并条件(或运算):
# 生成每个列对应的匹配逻辑向量 condition_vecs <- Map(function(col, vals) mydf[[col]] %in% vals, names(mylist), mylist) # 合并所有条件:满足任意一个条件则为TRUE logical_index <- Reduce(`|`, condition_vecs) # 获取符合条件的行索引 row_index <- which(logical_index) # 查看结果 logical_index row_index
方法2:dplyr(tidyverse)实现
如果偏好tidyverse风格,可使用across函数批量处理列条件:
library(dplyr) # 方法2.1:直接筛选行并提取索引 filtered_rows <- mydf %>% filter(across(all_of(names(mylist)), ~ .x %in% mylist[[cur_column()]]), .rows = any) row_index <- filtered_rows %>% row_number() # 方法2.2:生成逻辑向量 logical_index <- mydf %>% rowwise() %>% mutate(match = any(c_across(all_of(names(mylist))) %in% unlist(mylist)[names(c_across(all_of(names(mylist))))])) %>% pull(match)
内容的提问来源于stack exchange,提问作者DaniCee
相关产品推荐
相关产品推荐

