R语言如何使用县名列表检索描述列中含指定县名的行
原有代码错误说明
%in%是精确匹配运算符,只有当Description的完整内容和县名字段的某一值完全相等时才会返回TRUE,而你的县名是嵌入在长文本中的,因此无法命中。- apply行循环中调用了全量的
Df$Description,相当于每一行计算时都在判断整个数据集的描述列是否匹配,输出结果必然不符合预期。
解决方案
使用字符串正则匹配的方式批量检测,用tidyverse的stringr库函数实现最简便,运行效率高,1000行数据集耗时几乎可以忽略:
# 加载依赖,已安装加载过可跳过 library(tidyverse) # 拼接所有县名为正则或模式,fixed()避免县名含特殊字符干扰匹配 county_match_rule <- str_c(Carolina.Counties$county, collapse = "|") %>% fixed() # 新增标记字段,匹配到县名则为yes,否则为no df <- df %>% mutate(has_specified_county = if_else(str_detect(Description, county_match_rule), "yes", "no"))
如果需要同时提取出匹配到的具体县名,可以再加一个字段:
df <- df %>% mutate( has_specified_county = if_else(str_detect(Description, county_match_rule), "yes", "no"), matched_county_name = str_extract(Description, county_match_rule) )
补充说明
如果你的描述字段和县名的大小写不统一,可以把匹配规则改成不区分大小写的正则模式:
county_match_rule <- regex(str_c(Carolina.Counties$county, collapse = "|"), ignore_case = TRUE)
用你提供的示例数据测试,输出结果如下:
# A tibble: 3 × 4 `Donor Type` Amount Description has_specified_county <chr> <chr> <chr> <chr> 1 Single Donation 10 This is for Person County yes 2 Grant 50 Books for Beaufort County yes 3 Recurring Donation 100 Brews for Books no
内容的提问来源于stack exchange,提问作者Molly
相关产品推荐
相关产品推荐

