如何根据accession编号列表在RStudio中筛选DataFrame?
RStudio中DataFrame筛选问题解决方法
问题背景
现有如下结构的DataFrame(展示前6行):
gene_callers_id source accession function. e_value <int> <chr> <chr> <chr> <dbl> 1 4439568 MGE_type 2545_tnpA_CR555306.1 tnpA 3.11e-28 2 4439574 MGE_type 1420_IS91_CP003742.1 IS91 2e-14 3 4439922 MGE_type 1112_qacEdelta_AF261825.2 qacEdelta 3.48e-12 4 4440357 MGE_type 1610_int3_HE616890.1 int3 1.77e-26 5 4440603 MGE_type 1151_IS621_NC009800 IS621 7.18e-39 6 4440805 MGE_type 1010_tnpA_AJ233397.3 tnpA 8.71e-73
需要根据以下accession编号列表筛选数据:
V1 1 IPR000802 2 IPR001802 3 IPR002657 4 IPR003370 5 IPR003457 6 IPR003691
原代码问题分析
你尝试的代码存在两个关键问题:
as.vector(read.csv(...))会将数据框转换为按列展开的向量,无法正确提取筛选列表的每一项,应该直接提取数据框的第一列。grepl(mrg_accession, accession...)中,grepl不支持直接传入多个匹配模式的向量,需要将多个模式拼接成正则表达式才能实现“匹配任意一个模式”的效果。
正确解决方案
方法1:基础R实现
# 正确读取筛选列表:提取csv的第一列作为字符向量 mrg_accession <- read.csv("mrg_accession.csv", header = FALSE, colClasses = "character")[[1]] # 将多个匹配模式拼接成正则表达式(用|分隔,表示“或”) pattern <- paste(mrg_accession, collapse = "|") # 筛选accession列包含任意一个IPR编号的行 mrg_dbs <- subset(func_all, grepl(pattern, accession, ignore.case = TRUE))
方法2:tidyverse工具包实现(更直观)
如果你习惯用dplyr和stringr,写法更简洁清晰:
library(dplyr) library(stringr) mrg_accession <- read.csv("mrg_accession.csv", header = FALSE, colClasses = "character")[[1]] mrg_dbs <- func_all %>% filter(str_detect(accession, regex(paste(mrg_accession, collapse = "|"), ignore_case = TRUE)))
补充:精确匹配场景
如果你的需求是accession列的值与列表项完全相等,则不需要正则,直接用%in%即可:
mrg_accession <- read.csv("mrg_accession.csv", header = FALSE, colClasses = "character")[[1]] mrg_dbs <- filter(func_all, accession %in% mrg_accession)
内容的提问来源于stack exchange,提问作者Kevin Y
相关产品推荐
相关产品推荐

