格式化复杂变量名称的正则表达式

时间:2018-02-11 04:40:22

标签: r

我有一个双列数据框,并希望将其中一个列拆分为两个具有细菌菌株名称的列,另一个列为其中生长的Media。 该数据位于标题为" strain"并且格式为" Speciesname" - " Mediatype"。我想使用一个检测连字符的正则表达式" - "将两个变量分成不同的列。

以下是我迄今为止尝试过的代码:

lysate.long <-
lysate %>%
filter(str_detect(Strain, pattern = "[:alnum:]-[:alnum:]")) %>%
tidyr::extract(Strain,
             c("Strain", "Media"),
             regex = "([[:alnum:]])-([[:alnum:]]+)",
             convert = TRUE)

但是,上面的代码不包括在Strain和Media名称中都存在的句点。例如,菌株命名为大肠杆菌&#34;,&#34; B.Subtilis&#34;等等和媒体被命名为&#34; 0&#34;,&#34; 0.1&#34;,&#34; 0.01&#34;根据稀释。

目前使用的正则表达式仅检测句点之前或之后的字符。如何格式化它以便包含两个字符?

1 个答案:

答案 0 :(得分:0)

对于基础R解决方案,gsub应该有效:

df <- data.frame(x=c("E.coli-agar"))
df$species <- gsub("-.*$", "", df$x)
df$media <- gsub("^.*?-", "", df$x)

df
            x species media
1 E.coli-agar  E.coli  agar

Demo

对我的回答一个重要的假设是破折号对于每一条数据只出现一次,而且只出现一次。如果不是这种情况,我需要添加额外的逻辑。