如何在R语言中移除数据框中与指定列表元素不匹配的行?
筛选包含指定元素的数据框行
现有如下R语言生成的数据框:
df <- rbind("A*YOU 1.000 0.780", "A*YOUR 1.000 0.780", "B*USE 0.800 0.678", "B*USER 0.700 1.000") df <- as.data.frame(df)
运行后输出:
> df V1 1 A*YOU 1.000 0.780 2 A*YOUR 1.000 0.780 3 B*USE 0.800 0.678 4 B*USER 0.700 1.000
需要移除所有不包含列表 tenables <- c("A*YOU", "B*USE") 中任一元素的行,最终保留目标行。
方法1:基础R的grepl函数直接匹配
因为目标字符串里有正则特殊字符*,要设置fixed=TRUE把它当作普通字符处理,避免匹配出错:
tenables <- c("A*YOU", "B*USE") # 把目标元素用|拼接成匹配模式,固定匹配字符 df_filtered <- df[grepl(paste0(tenables, collapse = "|"), df$V1, fixed = TRUE), ]
运行后得到结果:
> df_filtered V1 1 A*YOU 1.000 0.780 3 B*USE 0.800 0.678
方法2:用stringr包的str_detect函数
如果习惯用tidyverse工具链,可以借助stringr包的匹配函数,同样要指定fixed模式:
library(stringr) tenables <- c("A*YOU", "B*USE") df_filtered <- df[str_detect(df$V1, fixed(tenables)), ]
搭配dplyr的filter函数更简洁:
library(dplyr) library(stringr) df_filtered <- df %>% filter(str_detect(V1, fixed(tenables)))
方法3:拆分列后精准匹配
如果不想用正则,也可以先拆分V1列,提取前面的标识部分再做精准匹配:
tenables <- c("A*YOU", "B*USE") # 拆分每行的V1内容,取第一个空格前的字符串 df$id <- sapply(strsplit(df$V1, " "), function(x) x[1]) # 筛选id在目标列表里的行 df_filtered <- df[df$id %in% tenables, ] # 可选:去掉临时添加的id列 df_filtered <- df_filtered[, "V1", drop = FALSE]
内容的提问来源于stack exchange,提问作者CNiessen
相关产品推荐
相关产品推荐

