strsplit拆分含短单词的物种名时无法正确按空格拆分的问题
物种名单词拆分问题解决
问题描述
从Wikidata获取Leptobrachella属物种列表时,需筛选双词结构的物种名以提取种加词,但部分双词物种(如Leptobrachella eos、Leptobrachella feii等,第二个单词长度≤4)被strsplit误判为单字,尝试\\s+、[[:space:]]等多种空格匹配规则均无效,需要准确拆分字符并统计单词数,仅将单字/三字及以上物种纳入non_binomial数据框。
原因分析
问题并非由短单词导致,而是这些物种名中的空格属于非标准空白字符(比如不间断空格U+00A0、全角空格等),普通的空格匹配规则无法识别这类字符,导致拆分失败。
解决方法
方案1:统一替换所有空白字符
使用stringr包将所有类型的空白字符替换为普通空格,再进行拆分计数:
# 安装并加载依赖包 install.packages(c("stringr", "dplyr")) library(stringr) library(dplyr) library(WikidataQueryServiceR) # 重新获取数据(复用原查询) df <- query_wikidata('SELECT DISTINCT ?item ?taxon_name WHERE { SERVICE wikibase:label { bd:serviceParam wikibase:language "[AUTO_LANGUAGE]". } { SELECT DISTINCT ?item WHERE { ?item p:P171 ?statement0. ?statement0 ps:P171 wd:Q2142033. } LIMIT 100 } OPTIONAL { ?item wdt:P225 ?taxon_name. } }') %>% as.data.frame() # 清洗物种名并统计单词数 df_clean <- df %>% # 替换所有空白字符为普通空格 mutate(taxon_name_clean = str_replace_all(taxon_name, "\\s", " ")) %>% # 拆分后统计单词数量 mutate(word_count = sapply(strsplit(taxon_name_clean, " "), length)) # 筛选非双词物种 non_binomial <- df_clean %>% filter(word_count != 2)
方案2:直接匹配所有空白字符拆分
无需替换,直接使用能匹配所有空白类型的正则表达式进行拆分:
df_clean <- df %>% mutate(word_count = sapply(strsplit(taxon_name, "\\s+"), length)) non_binomial <- df_clean %>% filter(word_count != 2)
方案3:统计空格数推导单词数
单词数等于空格数+1,用str_count直接统计空白字符数量:
df_clean <- df %>% mutate(space_count = str_count(taxon_name, "\\s")) %>% mutate(word_count = space_count + 1) non_binomial <- df_clean %>% filter(word_count != 2)
进阶:排查特殊空白字符
如果上述方法仍无效,可查看字符的Unicode编码确认空白类型:
# 查看目标字符串的字符编码 utf8ToInt(df[80,2])
若输出中包含160,说明是不间断空格U+00A0,可直接针对性替换:
df_clean <- df %>% mutate(taxon_name_clean = str_replace_all(taxon_name, "\u00A0", " "))
内容的提问来源于stack exchange,提问作者Mateus Figueiredo
相关产品推荐
相关产品推荐

