2010-10-01 6 views
4

Я хочу вернуть логический вектор для регулярных выражений спичек над вектором символа, но матч или% в, кажется, не поддерживает регулярные выражения, например:Возврат логического вектора для совпадений: поддерживается regexp?

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

Я хотел бы, чтобы вернуться

[1] TRUE TRUE FALSE 

Идеи?

Спасибо,

Роберто

ответ

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: два раза мы отправляем одновременно сегодня :-) Вы действительно скрываете вопросы, нет? Я удалил свой ответ, поскольку вы добавили его в свой пост. –

+0

@ Joris: ничего себе, те же три ответа за одну минуту ... Я тоже удалил. –

+0

@ Joshua: похоже, нам нужно больше вопросов для удовлетворения потребностей наших пользователей. Возможно, мы должны упомянуть о существовании этого сайта в списке рассылки R. Думаю, они не против потерять там немного трафика ... –

0

Один из способов просто обернуть два простых шага в функции, где мы получаем grep() сделать это дело, но поставить индексы элементов в x как LHS о вызове %in%:

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 

Редактировать

Упс, кажется, Дирк уже это дальше его ответ. Ради новизны, вот несколько других способов:

> 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 
Смежные вопросы