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

