使用通配符进行模式匹配

djq*_*djq 37 r wildcard pattern-matching

如何使用通配符识别字符串?

我发现了glob2rx,但我不太明白如何使用它.我尝试使用以下代码来选择以单词开头的数据框行blue:

# make data frame
a <- data.frame( x =  c('red','blue1','blue2', 'red2'))

# 1
result <- subset(a, x == glob2rx("blue*") )

# 2
test = ls(pattern = glob2rx("blue*"))
result2 <- subset(a, x == test )

# 3
result3 <- subset(a, x == pattern("blue*") )
Run Code Online (Sandbox Code Playgroud)

但是,这些都没有奏效.我不确定我是否应该使用不同的功能来尝试这样做.

42-*_*42- 41

如果要检查数据框内的元素,则不应使用ls()这些元素仅查看当前工作空间中对象的名称(或者如果在当前环境中的函数内使用).这些对象中的Rownames或元素是不可见的ls()(当然,除非您向-call 添加环境参数ls(.)).尝试使用grep()哪个是用于字符向量的模式匹配的主力函数:

result <- a[ grep("blue", a$x) , ]  # Note need to use `a$` to get at the `x`
Run Code Online (Sandbox Code Playgroud)

如果你想使用子集,那么考虑grepl()返回逻辑的向量的密切相关的函数可以在子集参数中使用:

subset(a, grepl("blue", a$x))
      x
2 blue1
3 blue2
Run Code Online (Sandbox Code Playgroud)

编辑:在subset()中添加一个"正确"使用glob2rx:

result <- subset(a,  grepl(glob2rx("blue*") , x) )
result
      x
2 blue1
3 blue2
Run Code Online (Sandbox Code Playgroud)

glob2rx直到我回到这个问题,我才认为我真的明白了.(我确实理解了提问者难以解决的范围问题.任何阅读此内容的人现在应该向下滚动到Gavin的答案并进行投票.)


Rei*_*son 32

glob2rx()将包含通配符的模式转换为等效的正则表达式.然后,您需要将此正则表达式传递给R的模式匹配工具之一.

如果你想匹配"blue*",其中*有通常的通配符,没有正则表达式,这意味着我们使用glob2rx()的通配符模式转换成有用的正则表达式:

> glob2rx("blue*")
[1] "^blue"
Run Code Online (Sandbox Code Playgroud)

返回的对象正则表达式.

鉴于您的数据:

x <- c('red','blue1','blue2', 'red2')
Run Code Online (Sandbox Code Playgroud)

我们可以使用grep()或类似工具进行模式匹配:

> grx <- glob2rx("blue*")
> grep(grx, x)
[1] 2 3
> grep(grx, x, value = TRUE)
[1] "blue1" "blue2"
> grepl(grx, x)
[1] FALSE  TRUE  TRUE FALSE
Run Code Online (Sandbox Code Playgroud)

至于您发布的选择行问题

> a <- data.frame(x =  c('red','blue1','blue2', 'red2'))
> with(a, a[grepl(grx, x), ])
[1] blue1 blue2
Levels: blue1 blue2 red red2
> with(a, a[grep(grx, x), ])
[1] blue1 blue2
Levels: blue1 blue2 red red2
Run Code Online (Sandbox Code Playgroud)

或通过subset():

> with(a, subset(a, subset = grepl(grx, x)))
      x
2 blue1
3 blue2
Run Code Online (Sandbox Code Playgroud)

希望能解释什么grob2rx()做以及如何使用它?