Подтвердить что ты не робот

Согласование шаблонов с использованием шаблона

Как определить строку с помощью шаблона?

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

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

4b9b3361

Ответ 1

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

Ответ 2

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

Ответ 3

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

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

Ответ 4

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

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