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

如何用grepl()从数据框列表中筛选指定列(含Duo与id列)

R语言:从数据框列表中筛选指定列

需求:从数据框列表中,筛选出名为id的列以及名称包含Duo的列,最终每个数据框保留2列。

示例数据

data <- list(foo = structure(list(bodyPart = c("leg", "arm", "knee"), 
side = c("LEFT", "RIGHT", "LEFT"), device = c("LLI", "LSM", 
"GHT"), `Duo:length` = c(12, 476, 7), id = c("AA", "BB", "CC"), 
mwID = c("a12", "k87", "j98")), class = "data.frame", row.names = c(NA, 
-3L)), bar = structure(list(bodyPart = c("ankel", "ear", "knee"
), `Duo:side` = c("LEFT", "LEFT", "LEFT"), device = c("GOM", "LSM", 
"YYY"), id = c("ZZ", "DD", "FF"), tqID = c("kj8", "ll23", "sc26"
)), class = "data.frame", row.names = c(NA, -3L)))

期望输出

output <- list(foo = structure(list(`Duo:length` = c(12, 476, 7), id = c("AA", "BB", "CC")), 
class = "data.frame", row.names = c(NA, -3L)), 
bar = structure(list(`Duo:side` = c("LEFT", "LEFT", "LEFT"), id = c("ZZ", "DD", "FF")), 
class = "data.frame", row.names = c(NA, -3L)))

问题代码

尝试了以下代码,但仅能筛选出id列,无法获取包含Duo的列:

lapply(data_list, function(cr) cr %>% dplyr::select(id, where(~any(grepl("Duo", names(.))))))

解决方法

方法1:使用dplyr的matches函数

matches()可以直接匹配列名,是筛选列名的正确方式:

library(dplyr)

output <- lapply(data, function(df) {
  df %>% 
    select(id, matches("Duo"))
})

方法2:Base R实现

无需依赖dplyr,直接通过列名筛选:

output <- lapply(data, function(df) {
  # 获取包含"Duo"的列名
  duo_cols <- grep("Duo", names(df), value = TRUE)
  # 合并id列和Duo相关列
  keep_cols <- c("id", duo_cols)
  # 提取指定列,drop=FALSE确保结果为数据框
  df[, keep_cols, drop = FALSE]
})

错误原因说明

之前代码里的where()函数是用于基于列的值进行筛选(比如筛选所有数值型列、所有满足某条件的列),而不是用来匹配列名的,因此无法正确选中列名包含Duo的列。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.30 22:05:29