R:通过出现字符

问题描述

我在数据框 species_name 中有一个向量 genexp_2016,其中包含常用名称和科学名称,以及几个不同物种的位置。例如,species_name 字符串可以写成

head(genexp_2016)
                                                       
  rank                                               species_name status
1 1396               Addax (Addax nasomaculatus) - Wherever found      E
2 1313            Babirusa (Babyrousa babyrussa) - Wherever found      E
3 1396     Baboon,gelada (Theropithecus gelada) - Wherever found      T
4  229 Bat,Florida bonneted (Eumops floridanus) - Wherever found      E
5  109             Bat,gray (Myotis grisescens) - Wherever found      E

然而,我试图做的是找到一种方法删除“species_name”中每个字符串的末尾,这样我就只剩下通用名称和科学名称,并删除位置(“无论在哪里找到')。

我曾想过尝试告诉 R 在 - 字符第一次出现后删除所有内容,但这是一种不完美的方法,因为数据框中的某些物种的名称中有母牛,例如黑色-足雪貂。

我想到的最有效的解决方案是:告诉 R 从末尾而不是开头读取字符串,并在找到 - 的第一次出现时,删除该字符在字符串中的位置之间的所有内容字符串和字符串的结尾。看起来这是我应该能够在 R 中做的事情,但我的技能目前还没有那么先进,不知道如何做到这一点。有没有人对我如何编码这个有任何想法,或者对我来说删除每个字符串中的位置描述的更有效方法

谢谢,感谢您提供的任何帮助。

解决方法

将所有内容都保留到最后一个 -(这里的关键字是 greedy),您可以这样做:

x <- 'Addax (Addax nasomaculatus) - Wherever found'
sub('(.+)-.+','\\1',x)
# [1] "Addax (Addax nasomaculatus) "