字符串与R中的GREPL和WITH函数匹配

时间:2016-10-06 06:22:35

标签: r regex grepl

我希望删除数据框中不符合特定列中正则表达式的任何行,即单元格必须以两个字符后跟四个数字开头,之后我不在乎它是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"

任何人都可以指导我犯错吗?

1 个答案:

答案 0 :(得分:4)

问题似乎是模式中的使用$,这意味着字符串的结尾,因为它是元字符,但根据输入显示,情况并非如此,因为在4位数之后还有其他字符也是如此,即字符串不以6个字符结尾,因此对于OP的模式,grepl将返回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