使用通配符的模式匹配



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

我找到了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*") )

然而,这两种方法都不起作用。我不确定我是否应该使用不同的函数来尝试这样做

如果你想检查数据框内的元素,你不应该使用ls(),它只查看当前工作区中对象的名称(或者如果在当前环境中的函数内使用)。这些对象中的行名或元素对ls()是不可见的(当然,除非您向ls(.)调用添加一个环境参数)。尝试使用grep(),这是字符向量模式匹配的主力函数:

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

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

subset(a, grepl("blue", a$x))
      x
2 blue1
3 blue2

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

result <- subset(a,  grepl(glob2rx("blue*") , x) )
result
      x
2 blue1
3 blue2

我不认为我真正理解glob2rx,直到我回到这个问题。(我确实理解问题的范围界定,这是提问者困难的根源。任何读到这篇文章的人现在都应该向下滚动到加文的答案并投票。

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

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

> glob2rx("blue*")
[1] "^blue"

返回对象正则表达式。

给定你的数据:

x <- c('red','blue1','blue2', 'red2')

我们可以使用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

关于你发布的选择行问题

> 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

或通过subset():

> with(a, subset(a, subset = grepl(grx, x)))
      x
2 blue1
3 blue2

希望这解释了grob2rx()做什么和如何使用它?

你在正确的轨道上-你应该搜索的关键字是正则表达式。R使用grep()和其他一些替代方法以更直接的方式支持它们。

这里有一个详细的讨论:http://www.regular-expressions.info/rlanguage.html

如果您确实想使用通配符来标识特定的变量,那么您可以使用ls()grep()的组合,如下所示:

l = ls()
vars.with.result <- l[grep("result", l)]

您也可以使用包数据。表和Like函数,详细信息如下所示如何选择R数据。基于子字符串匹配的表行(类似SQL)

另一种实现所需功能的方法是通过dplyr()

filter(str_detect(a, "blue"))
它会考虑所有blue的实例,例如blue1blue2

这个命令与

基本相同
filter(str_detect(a, "blue") == TRUE)

如果蓝色是大写和小写的,你可以这样做:

filter(str_detect(str_to_lower(a), "blue"))

我希望它能帮助那些正在寻找类似解决方案的人。

相关内容

  • 没有找到相关文章

最新更新