在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"