【问题标题】:String matching with GREPL and WITH functions in R与 R 中的 GREPL 和 WITH 函数匹配的字符串
【发布时间】:2016-10-06 06:22:35
【问题描述】:

我希望删除数据框中不符合特定列中正则表达式的任何行,即单元格必须以两个字符开头,后跟四个数字,之后我不在乎它是 U09 还是 U21。前 6 个字符很重要。

我正在使用以下代码,但返回了 0 行,我不确定为什么:

with(prachData, prachData[grepl("^[A-Z][A-Z][0-9]{4}$", WCEL.name), ])

当我输入head(prachData$WCEL.name) 时,我得到以下详细信息:

> head(prachData$WCEL.name)
[1] 0           0           CE0001U21B2 CE0001U21A3 CE0001U21C1 CE0001U21B1
13684 Levels: 0 1 11 12 13 2 21 22 23 3 31 32 33 CE0001U09A3 CE0001U09B3 CE0001U09C3 CE0001U21A1 CE0001U21A2 ... WX0114U09C3

使用class(prachData$WCEL.name) 我得到:

[1] "factor"

谁能指导我解决我的错误?

【问题讨论】:

    标签: r regex grepl


    【解决方案1】:

    问题似乎是在模式中使用$,这意味着字符串的结尾,因为它是一个元字符,但根据显示的输入,情况并非如此,因为在 4 位数字之后还有其他字符为好吧,即字符串不是仅以 6 个字符结尾,因此 grepl 将为 OP 的模式返回 FALSE。相反,它可以,

    with(prachData, prachData[grepl("^[A-Z][A-Z][0-9]{4}", WCEL.name), ])
    

    展示一个可重现的例子

    v1 <- factor(c(0,           0,           'CE0001U21B2', 'CE0001U21A3', 
                     'CE0001U21C1', 'CE0001U21B1'))
    grepl("[A-Z]{2}[0-9]{4}$", v1)
    #[1] FALSE FALSE FALSE FALSE FALSE FALSE
    

    返回所有 FALSE

    所以,当我们根据上面的索引子集 'v1' 时,

    v1[grepl("[A-Z]{2}[0-9]{4}$", v1)]
    #factor(0)
    #Levels: 0 CE0001U21A3 CE0001U21B1 CE0001U21B2 CE0001U21C1
    

    它返回长度为 0。

    同时

    grepl("[A-Z]{2}[0-9]{4}", v1)
    #[1] FALSE FALSE  TRUE  TRUE  TRUE  TRUE
    

    【讨论】:

    • 感谢 Akrun 的详细解释。我在代码的另一部分使用了类似的正则表达式,这次我希望在 with 函数的末尾添加另一个表达式。这次我有以下代码:AtollInService &lt;- with(Atoll, Atoll[!grepl("[_()]", NOMINAL_ID) &amp; grepl("InService", MILESTONE),!(names(Atoll) %in% atollColDrop),(Atoll, Atoll[grepl("^[A-Z][A-Z][0-9]{4}", THREE_G_CELL_ID),])]) 我一直收到一个错误,提示意外','!(names(Atoll) %in% atollColDrop), (Atoll," 我需要用'&'替换','吗?
    • @PigWolf 你能举个例子吗?我认为Atoll[ 部分应该在外部,即Atoll[withAtoll, !grepl("...Also,关于,!(names(Atoll..`,您是否正在尝试行和列的子集。
    • 我的代码的第一部分按我的意愿工作,但我也试图在语句的末尾添加一个正则表达式,以删除“THREE_G_CELL_ID”列中不符合正则表达式的任何行.我的原始代码是 AtollInService &lt;- with(Atoll, Atoll[!grepl("[_()]", NOMINAL_ID) &amp; grepl("InService", MILESTONE) &amp; grepl("^[A-Z][A-Z][0-9]{4}$", NOMINAL_ID) &amp; !grepl("[L18]+[L08]", THREE_G_CELL_ID), !(names(Atoll) %in% atollColDrop)]) 我希望在此语句中添加一个正则表达式,以删除“THREE_G_CELL_ID”列中不以 [A-Z][A-Z][0-9]{4} 开头的行。
    • @PigWolf 您能否将其作为一个新问题发布,因为 cmets 并不清楚
    • 会做的,为糟糕的解释道歉
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-17
    • 2020-06-01
    • 2013-03-16
    • 2020-01-26
    • 1970-01-01
    相关资源
    最近更新 更多