在R中分隔长名称和复杂名称

在R中分隔长名称和复杂名称,r,dataset,data-manipulation,R,Dataset,Data Manipulation,假设我的数据集中有以下植物物种的完整科学名称列表: FullSpeciesNames <- c("Aronia melanocarpa (Michx.) Elliott", "Cotoneaster divaricatus Rehder & E. H. Wilson","Rosa canina L.","Ranunculus montanus Willd.") FullSpeciesNames我们可以使用sub来匹配一个单词(\\w+),后跟一个或多个空格(\\s+),后跟另一个

假设我的数据集中有以下植物物种的完整科学名称列表:

FullSpeciesNames <- c("Aronia melanocarpa (Michx.) Elliott", "Cotoneaster divaricatus Rehder & E. H. Wilson","Rosa canina L.","Ranunculus montanus Willd.")

FullSpeciesNames我们可以使用
sub
来匹配一个单词(
\\w+
),后跟一个或多个空格(
\\s+
),后跟另一个单词和空格,作为一个组捕获,以及其余字符(
*
)。在替换中,使用捕获组的反向引用(
\\1


函数使用更复杂但不需要正则表达式的另一种方法是

substring(FullSpeciesNames,
          1, sapply(gregexpr(" ", FullSpeciesNames, fixed=TRUE), "[[", 2) - 1)
[1] "Aronia melanocarpa" "Cotoneaster divaricatus" "Rosa canina" "Ranunculus montanus"

gregexpr
可用于查找字符串中某些字符的位置(它还可以查找带有正则表达式的模式)。这里我们正在寻找空间。它返回字符向量中每个字符串的位置列表
sapply
用于提取第二个空格的位置。这些位置的向量(减1)被馈送到
子字符串
,该子字符串贯穿初始向量,并将子字符串从第一个字符开始带到指定的位置。

这并不完全是您所要求的,但您可以使用
taxize
库中的函数
gnr\u resolve()
(FullSpeciesNames,best\u match\u only=T,canonical=T)
。这将只输出属物种名称,但也允许处理物种名称同义词。
trimws(sub("^((\\w+\\s+){2}).*", "\\1", FullSpeciesNames))
substring(FullSpeciesNames,
          1, sapply(gregexpr(" ", FullSpeciesNames, fixed=TRUE), "[[", 2) - 1)
[1] "Aronia melanocarpa" "Cotoneaster divaricatus" "Rosa canina" "Ranunculus montanus"