在R中,我在数据框中有一列数据,每个元素看起来像这样:
Bacteria;Bacteroidetes;Bacteroidia;Bacteroidales;Marinilabiaceae
我想要的是最后一个分号之后的部分,我一直在尝试使用'sub'并复制现有列并创建一个只保留结尾的新列。从本质上讲,我想要这个(属):
Marinilabiaceae
代码片段如下所示:
mydata$new_column<- sub("([\\s\\S]*;)", "", mydata$old_column)
在这种情况下,由于R的转义序列,我使用的是\\
而不是\
。 sub
替换了我不想要的部分,并将其更新为新列。我已经在这样的地方多次测试了Regex:http://regex101.com/r/kS7fD8/1
然而,我仍在苦苦挣扎,因为结果非常奇怪。现在我的新专栏中填充了有机体的域而不是属Bacteria
。
我该如何解决这个问题?是否有任何易于理解的资源可以更多地了解R的Regex格式?
答案 0 :(得分:1)
让它贪婪并从所需的索引中获取匹配的组。
(.*);(.*)
^^^------- Marinilabiaceae
要获得第一个单词,请使用 Non-Greedy 方式
(.*?);(.*)
Bacteria -----^^^
这是demo
答案 1 :(得分:1)
从简单的字符串开始,
string <- "Bacteria;Bacteroidetes;Bacteroidia;Bacteroidales;Marinilabiaceae"
您可以在"^(.*);"
sub
删除最后一个分号的所有内容
> sub("^(.*);", "", string)
# [1] "Marinilabiaceae"
您还可以将strsplit
与tail
> tail(strsplit(string, ";")[[1]], 1)
# [1] "Marinilabiaceae"
您的正则表达式([\\s\\S]*;)
主要不会起作用,因为\\s
匹配任何空格字符,并且您的字符串不包含任何空格。我认为它在regex101网站上有效,因为该正则表达式测试器默认为pcre (php)
(参见&#34; Flavor&#34;在左上角),R regex语法略有不同。在许多情况下,R需要额外的反斜杠转义字符。作为参考,this R text processing wiki以前曾多次派上用场。
答案 2 :(得分:1)
在最后一次之后提取所有内容;到你可以使用的行的末尾:
[^;]*?$