在R中分隔长而复杂的名称

时间:2017-03-28 15:26:13

标签: r dataset data-manipulation

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

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?

中完成

2 个答案:

答案 0 :(得分:2)

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

trimws(sub("^((\\w+\\s+){2}).*", "\\1", FullSpeciesNames))

答案 1 :(得分:1)

在功能使用方面更复杂但不需要正则表达式的替代方案是

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

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