在R中使用正则表达式对数据进行分叉

时间:2018-08-01 00:54:27

标签: r

我是R的新手,我想了解R中的正则表达式。因此,我有datatable(df)的列(FileName2),其中的字符串具有不同的模式,并且我必须了解字符串,并给它一个名称,例如标识符,以便标识符可以识别相同的模式。标识符的名称必须在同一数据表的另一列中。我有以下3种不同的模式: 1.字符串名称:Modifc10或可以是modifc1:前五个字符是固定的,下一个是固定的字母,下一个可以是一个或两个数字。让我们以此作为标识符1。 2.字符串名称:modifcwi12或modifcfl1:前五个字符固定,后三个字母固定,下一个可以是一或两个数字。以其为标识符2。 3.String名称:MODIFSW:前五个字符是固定的,后三个或两个是字母,而不是数字。请以该字符作为标识符三。

i/p:
FileName2
MODIFC1
MODIFC10
MODIFC2
modifcfl1
MODIFCS
modifcWA1
modifcWI10
modifcWI7
MODIFS7
modifsfl1
modifsWI1
modifsWI10
modifsWI2

我想用正则表达式来做到这一点。我正在尝试这样做>>

df1 <- df[FileName2 %like% '(?i)modif\\w\\d',Identifier := 'One']
df2 <- df1[FileName2 %like% '(?i)modif\\w\\w\\w\\d',Identifier := 'Two']
df3 <- df2[FileName2 %like% '(?i)modif\\w',Identifier := 'Third']

但是,它没有给出准确的结果。我很确定,我没有使用正确的正则表达式或正确的方法来执行此操作。请让我知道执行此操作的有效方法。

O / p应该像:

 FileName2    Identifier
    MODIFC1      One    
    MODIFC10     One
    MODIFC2      One
    modifcfl1    Two
    MODIFCS      Three
    modifcWA1    Two
    modifcWI10   Two
    modifcWI7    Two
    MODIFS7      One
    modifsfl1    Two
    modifsWI1    Two
    modifsWI10   Two
    modifsWI2    Two

1 个答案:

答案 0 :(得分:0)

请注意,根据您的预期输出,规则3中存在错误; bool Student::operator < (const Student b) { return year < b.year ? true : false; } 的前5个字符固定不变,后面仅2个字符(而不是您的规则中的3个字符)。

我假设对于规则3,MODIFCS / "modif"后面可以有2个 3个字符。

我们可以将"MODIF"dplyr::case_when一起使用

stringr::str_detect

样本数据

library(tidyverse)
df %>%
    mutate(Identifier = case_when(
        str_detect(tolower(Filename2),"^modif[a-z]\\d{1,2}$") ~ "One",
        str_detect(tolower(Filename2),"^modif[a-z]{3}\\d{1,2}$") ~ "Two",
        str_detect(tolower(Filename2),"^modif[a-z]{2,3}$") ~ "Three"
    ))
#    Filename2 Identifier
#1     MODIFC1        One
#2    MODIFC10        One
#3     MODIFC2        One
#4   modifcfl1        Two
#5     MODIFCS      Three
#6   modifcWA1        Two
#7  modifcWI10        Two
#8   modifcWI7        Two
#9     MODIFS7        One
#10  modifsfl1        Two
#11  modifsWI1        Two
#12 modifsWI10        Two
#13  modifsWI2        Two