如何基于多列目标物种字符串筛选R语言DataFrame?
树木重植数据库筛选问题
我有一个树木重植项目的大型数据库,需要从3个不同列中筛选出包含约70个目标物种的行来生成新数据库。目前遇到两个问题:
- 使用
grepl函数对SPECIES列筛选时,结果出现不含目标物种的行 - 不知道如何对多列应用相同的关键词筛选
附示例数据与代码,寻求可批量处理16个大型数据集的解决方案:
示例数据与代码
# 示例数据结构 dput(head(NCR[,c("REGION", "COMPONENT","SPECIES")])) structure(list(REGION = c("NCR", "NCR", "NCR", "NCR", "NCR", "NCR"), COMPONENT = c("Urban", "Urban", "Urban", "Urban", "Urban", "Urban"), SPECIES = c("Narra", "Banaba, Caballero, Ilang ilang, Molave, Yellow alder,Bougainvilla,", "Bignay, Camachile, Nangka, Sampaloc, Santol,Narra,kalumpit,langka,lipote,guyabano,palawan cherry,banaba,mahogany,Golden shower,Mangqa,Bayabas,bignay,molave", "Sansevieria, Spider lily, Yellow morado, Zigzag, Sansevieria, Spider lily, Yellow morado, Zigzag Sansevieria, Spider lily, Yellow morado, Zigzag", "Banaba, Caballero, Ilang ilang, Narra, Tuai,", "Acacia, Acapulco, Antipolo, Bagras, Balete, Bougainvilla, Dao, Fire tree, Golden shower, Ipil, Kalumpit, Kamagong, Lipote, Manila palm, Molave, Nangka, Neem tree, Supa, Tuai, Yakal,mabolo,tabebuia,langka,bitaog,narracamachile,banaba,ilang ilang,guyabano" )), row.names = c(NA, -6L), class = c("tbl_df", "tbl", "data.frame" )) # 目标物种关键词 key_terms <- c('mangrove','magrove','avicennia','bungalon','api-api','piapi','piape','miapi','myapi','miape','Rhizophora','bakau','Bakauan', 'bakaw','bakhaw','bacau','bacaw','Sonneratia','pagatpat','pedada','Nypa','nipa','nypa','sasa','Bruguiera','pototan','busain','langarai','Camptostemon','gapas','Ceriops','baras','tungog','tangal','Excoecaria','lipata','buta','Heritiera','dungon','Aegiceras','saging','Lumnitziera','tubao','culasi','kulasi','Osbornia','tawalis','bunot','Pemphis','bantigi','Scyphiphora','nilad','Xylocarpus','tabigi','tabige','piagao','piag-ao','tubo tubo','tubo-tubo','saging-saging','moluccensis','granatum','hydrophyllaceae','adicula','octodonta','corniculatum','littoralis','agallocha','tagal','decandra','philippinensis','parviflora','fruticans','caseolaris','ovata','alba' ) # 原筛选代码 new_NCR <- filter(NCR, grepl(paste(key_terms, collapse='|'), SPECIES)) new_NCR
解决方案
1. 修正grepl的误匹配问题
出现无关行的核心原因是默认的部分匹配会把关键词作为子串匹配到其他单词中(比如moluccensis会匹配Molave里的mol片段)。解决方法是给每个关键词添加单词边界,并开启大小写不敏感匹配:
# 给关键词添加单词边界,确保匹配完整单词 key_terms_regex <- paste0("\\b", key_terms, "\\b", collapse = "|") # 修正后的单列筛选代码 new_NCR <- NCR %>% filter(grepl(key_terms_regex, SPECIES, ignore.case = TRUE))
2. 多列应用相同筛选规则
如果需要对多个列(比如REGION、COMPONENT、SPECIES)进行筛选,只要任意一列包含目标关键词就保留该行,推荐使用dplyr的if_any函数(需dplyr 1.0.0及以上版本):
# 指定需要筛选的列 target_cols <- c("REGION", "COMPONENT", "SPECIES") # 多列筛选:任意一列匹配关键词则保留该行 new_NCR_multi <- NCR %>% filter(if_any(all_of(target_cols), ~grepl(key_terms_regex, ., ignore.case = TRUE)))
3. 批量处理16个大型数据集
将所有数据集放入列表,用purrr::map批量处理,避免手动重复操作:
library(purrr) library(dplyr) # 假设所有数据集命名为data1到data16,将它们存入列表 dataset_list <- mget(paste0("data", 1:16)) # 批量处理每个数据集 processed_list <- map(dataset_list, function(df) { df %>% filter(if_any(all_of(target_cols), ~grepl(key_terms_regex, ., ignore.case = TRUE))) }) # 可选:将处理后的数据集保存为CSV文件 walk2(processed_list, names(processed_list), function(df, name) { write.csv(df, paste0("processed_", name, ".csv"), row.names = FALSE) })
内容的提问来源于stack exchange,提问作者badiskhiari
相关产品推荐
相关产品推荐

