在 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
,它贯穿初始向量并将子字符串从第一个字符开始到指示的位置。
假设我的数据集中有以下植物物种的完整科学名称列表:
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
,它贯穿初始向量并将子字符串从第一个字符开始到指示的位置。