You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.17 18:53:11