Сопоставление с шаблоном с использованием подстановочного знака - PullRequest
37 голосов
/ 28 апреля 2011

Как определить строку, используя подстановочный знак?

Я нашел 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*") )

Однако ни один из них не сработал. Я не уверен, стоит ли мне использовать другую функцию, чтобы попытаться это сделать.

Ответы [ 5 ]

41 голосов
/ 28 апреля 2011

Если вы хотите исследовать элементы внутри фрейма данных, вы не должны использовать ls(), который просматривает только имена объектов в текущем рабочем пространстве (или если используется внутри функции в текущей среде). Rownames или элементы внутри таких объектов не видны для ls() (если, конечно, вы не добавите аргумент окружения к ls(.) -call). Попробуйте использовать 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, пока не вернулся к этому вопросу. (Я действительно понимал проблемы с областями видимости, которые были причиной трудностей спрашивающего. Любой, кто читает это, должен сейчас прокрутить до ответа Гэвина и поднять его.)

32 голосов
/ 28 апреля 2011

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() и как его использовать?

4 голосов
/ 28 апреля 2011

Вы на правильном пути - ключевое слово, которое вы должны искать, - это регулярные выражения.R поддерживает их более прямым способом, чем это, используя grep() и несколько других альтернатив.

Вот подробное обсуждение: http://www.regular -expressions.info / rlanguage.html

2 голосов
/ 09 июня 2015

Вы также можете использовать пакет data.table и его функцию Like, подробности приведены ниже Как выбрать R data.table строк на основе совпадения подстроки (в стиле SQL)

2 голосов
/ 07 ноября 2013

Если вы действительно хотите использовать подстановочные знаки для определения конкретных переменных, тогда вы можете использовать комбинацию ls() и grep() следующим образом:

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

...