仅当多于一个单词R时才从字符串中提取最后一个单词

时间:2017-11-21 16:11:57

标签: r string character

我在从字符串中提取单词时遇到了一些问题。我有一个专栏,是物种“Genus species”的分类名称。我试图用物种创建一个新的专栏。最初我刚刚使用

library(stringr)
count$species  <- word(count$taxon_name, 2)

提取第二个单词。这很有效,直到我意识到taxon_name列中有一些条目在属和种之间有一个括号词,就像这样,“Genus(word)species”

要删除我编写的这段代码,它可以很好地从具有额外单词的条目中删除parantehsis:

count$new_taxon <- gsub("\\([^()]*\\)", "", count$taxon_name)

然后在新专栏

上执行上述操作
count$species  <- word(count$new_taxon, 2)

这仍适用于所有尚未更改的内容,但如果某个条目删除了一个括号,则只会将该条目留空,并且不会提取任何内容。我认为这可能是将空间视为一个词?我尝试改变列是否是因素或字符列,并没有产生任何影响。有什么建议吗?

注意:taxon_name列中基本上有三种类型的输入 (1)属种 (2)属和 (3)属(词)种。

当我尝试提取最后一个单词的任何内容时,它处理情况(1)和(3)但现在它包括(2)我只想成为NA,因为它没有物种。

2 个答案:

答案 0 :(得分:1)

假设“物种”从不是多个单词,你可以这样做:

count$species <- gsub("^.*\\s(\\w+)$", "\\1", count$taxon_name)

模式(\\s(\\w+)$表示匹配空格,然后匹配多个单词字符,然后匹配字符串的结尾,换句话说,它匹配字符串的最后一个单词。然后我们使用\\1

替换捕获组1

实例:

https://regex101.com/r/toJeTg/1

答案 1 :(得分:1)

可能类似以下内容。

x <- c("Genus species", "Genus", "Genus (word) species")
y <- gsub(".*[[:blank:]](\\w+)$", "\\1", x)
is.na(y) <- y == "Genus"
y
[1] "species" NA        "species"

请注意,搜索"species"应该非常困难,因为我们没有完整的列表。这就是为什么我选择这样做,将结果y的元素设置为NA,如果它们等于"Genus"