返回匹配的逻辑向量:支持正则表达式吗?

5

我希望能够返回一个逻辑向量,用于对字符向量进行正则表达式匹配,但是match或%in似乎不支持正则表达式,例如:

> x <- c("Bill", "Brett", "Jane")
> grep("^B", x)
[1] 1 2
> x %in% "^B"
[1] FALSE FALSE FALSE

I would like this to return

[1] TRUE TRUE FALSE

有什么想法?

谢谢,

罗伯托

3个回答

6

只需链接它:

> seq(along=(x)) %in% grep("^B", x)
[1]  TRUE  TRUE  FALSE

所以,你可以编写一个小的辅助函数来完成这两个操作,如下所示。但我想其中一个grep()变体也可以做到这一点...啊,是的,grepl()是你的好朋友:

> grepl("^B", x)
[1]  TRUE  TRUE  FALSE

没有什么问题是一个快速的help(grep)不能解决的 ;-)


1
@comment: 今天我们同时发布了两次 :-) 你真的很留意这些问题,对吗?我删除了我的答案,因为你将它添加到了你的帖子中。 - Joris Meys
@Joris:哇,一分钟内出现了相同的三个答案...我也删除了我的。 - Joshua Ulrich
@Joshua:看起来我们需要更多的问题来满足我们的回答需求。也许我们应该在 R 的邮件列表上提到这个网站的存在。我猜他们不会介意失去一点流量... - Joris Meys
@Joris,也许是这样,但你必须问问自己,你是否真的想要那些流量。;-) - Joshua Ulrich

1
一种方法是将两个简单步骤封装在一个函数中,其中我们使用grep()来执行其操作,但将x中元素的索引作为调用%in%的LHS提供:
foo <- function(x, pattern, ...) {
    seq_along(x) %in% grep(pattern, x, ...) 
}

使用您的示例数据,我们得到:

> x <- c("Bill", "Brett", "Jane")
> foo(x, pattern = "^B")
[1]  TRUE  TRUE FALSE

1
使用grepl函数:
> x <- c("Bill", "Brett", "Jane") 
> grepl("^B", x) 
[1]  TRUE  TRUE FALSE

编辑

哎呀,看起来Dirk已经在他的回答中进一步解释了这个问题。为了新奇起见,这里提供其他一些方法:

> ans <- rep(FALSE,length(x))
> ans[grep("^B",x)]<-TRUE
> ans
[1]  TRUE  TRUE FALSE


> 1:length(x) %in% grep("^B",x)
[1]  TRUE  TRUE FALSE

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接