代码之家  ›  专栏  ›  技术社区  ›  Ally D

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

  •  1
  • Ally D  · 技术社区  · 7 年前

    我对从字符串中提取单词有点小问题。我有一列是一个物种的分类名称 “属种” . 我试图创建一个新的专栏,只介绍物种。最初我只是使用

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

    提取第二个单词。这很有效,直到我意识到 taxon_name 在属和种之间有一个括号的列,如下所示, “属(词)种” .

    为了消除这种情况,我编写了这段代码,它非常有效地从包含该额外单词的条目中删除了偏旁词:

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

    然后在新列上执行上述操作

    count$species  <- word(count$new_taxon, 2)
    

    这仍然适用于所有未更改的条目,但如果删除了括号,则只会将条目留空,并且不会提取任何内容。我想可能是把空格当成了一个单词?我试着改变这个列是因子列还是角色列,但没有什么不同。有什么建议吗?

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

    当我尝试提取最后一个词时,它处理案例(1)和(3),但现在它包括(2),我只想成为NA,因为它没有物种。

    2 回复  |  直到 7 年前
        1
  •  1
  •   Rui Barradas    7 年前

    可能是下面这样。

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

        2
  •  1
  •   Mako212    7 年前

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

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

    模式 (\\s(\\w+)$ 意思是匹配一个空格,然后是多个文字字符,然后是字符串的末尾,换句话说,它匹配字符串的最后一个字。然后,我们使用 \\1

    实例:

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