如何在字符向量中搜索字符串以及 TRUE 在哪里用原始元素的一部分替换整个元素?

How to search character vector for string and where TRUE replace entire element with part of original element?

我正在尝试编写一个函数,它接受一个向量,在该向量中搜索包含特定字符串的元素,并将该元素的整个文本替换为原始元素中的第一个单词。

例如,我有:

vec <- c("eolimna pala", "achnanthes lata", "navicula spp.", "diploneis spp. 2")

我想得到:

vec <- c("eolimna pala", "achnanthes lata", "navicula", "diploneis")

这或多或少是我所拥有的。任何帮助深表感谢。 编辑:如果我可以提供一个包含多个字符串的字符向量作为参数来检查每个元素,那将会更有帮助。

rollToGenus <- function (vec) { 

  greps <- grepl(" spp. ", as.character(vec))

  for (i in 1:length(vec)) {
    if (greps[i] == TRUE) {
      paste(str_split_fixed(i, " ", n=6)[1])
    }
  }
}

不就是下面这样吗:

gsub(" spp\..*$", "", vec)
# [1] "eolimna pala"    "achnanthes lata" "navicula"        "diploneis"

编辑: gsub 替换字符串中的(正则表达式)模式。 " spp\..*$" 查找所有 " spp."\. 转义 .,这意味着 任何字符 )后跟任何字符 . zero/multiple 次 * 直到字符串结尾 $.

您的解决方案几乎相同(但使用 ifelsegrepl 来处理 [g]sub 可以单独完成的事情)。这就是为什么我的解决方案看起来更干净并且应该更快:

library("microbenchmark")
vec <- c("eolimna pala", "achnanthes lata", "navicula spp.", "diploneis spp. 2")
all.equal(gsub(" spp\..*$", "", vec), 
          ifelse(grepl(" spp.", vec, fixed = TRUE), sub(" .*", "", vec), vec))
# [1] TRUE

microbenchmark(gsub=gsub(" spp\..*$", "", vec), 
               ifelse=ifelse(grepl(" spp.", vec, fixed = TRUE), sub(" .*", "", vec), vec))
# Unit: microseconds
#    expr    min      lq     mean median     uq     max neval
#    gsub 23.301 24.1305 26.39183 25.599 26.168  56.770   100
#  ifelse 49.791 51.1235 56.00751 51.760 52.576 170.134   100

有人发布了这个然后删除了它。它对我有用。

ifelse(grepl(" spp.", vec, fixed = TRUE), sub(" .*", "", vec), vec)