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

Separate long and complex names in R

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

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

我想获取简化名称的列表,即仅给定名称的前两个元素,即:

SimpleSpeciesNames<- c("Aronia melanocarpa", "Cotoneaster divaricatus", "Rosa canina", "Ranunculus montanus")

如何在 R 中完成此操作?

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

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"

gregexpr 可用于查找字符串中某些字符的位置(它也可以使用正则表达式查找模式)。在这里我们正在寻找 spaces。它 returns 字符向量中每个字符串的位置列表。 sapply用于提取第二个space的位置。这些位置的向量(减去一个)被馈送到substring,它贯穿初始向量并将子字符串从第一个字符开始到指示的位置。