2015-04-27 2 views
2

Спасибо за grep using a character vector with multiple patterns, я тоже выяснил свою проблему. Вопрос здесь в том, как найти несколько значений с помощью функции Grep, и раствор либо эти:R: Почему не работает цикл или c() для функции grep?

grep("A1| A9 | A6") 

или

toMatch <- c("A1", "A9", "A6") 
matches <- unique (grep(paste(toMatch,collapse="|") 

Таким образом, я использовал второй предложение, так как я имел много значений в искать.

Но мне любопытно, почему c() или для цикла не работает вместо |. Прежде чем я исследовал возможные решения в StackOverflow и нашел рекомендации выше, я попробовал два варианта, которые я продемонстрирую ниже:

Во-первых, то, что я написал в R было что-то вроде этого:

find.explore.l<-lapply(text.words.bl ,function(m) grep("^explor",m)) 

Но тогда я должен был много слов «Grep», так что я попробовал это

find.explore.l<-lapply(text.words.bl ,function(m) grep(c("A1","A2","A3"),m)) 

это не сработало, поэтому я попытался еще один (XXX список слов, которые я должен найти в текст)

for (i in XXX){ 
    find.explore.l<-lapply(text.words.bl ,function(m) grep("XXX[i]"),m)) 
    .......(more lines to append lines etc) 
    } 

и казалось, что R попытался сопоставить XXX [i], а не слова внутри. Почему не может c() и для цикла для grep возвращать правильные результаты? Кто-нибудь, пожалуйста, дайте мне знать! Я так любопытно: P

+5

'Grep (с ("A1", "A2", "A3"), м)) 'не работает, потому что' grep' не векторизован над аргументом 'pattern' - это должно быть одно регулярное выражение. 'grep (" XXX [i] "), m))' не работает, потому что у вас есть кавычки вокруг 'XXX [i]', поэтому он интерпретируется как строковый литерал, а не как объект. – nrussell

+2

Можете ли вы показать некоторые входные и выходные данные? Вы считали функцию «Vectorize»? – A5C1D2H2I1M1N2O1R2T1

+0

'grep (c (« A1 »,« A2 »,« A3 »), m))' нарушает синтаксис grep. 'grep (pattern, x, ...' .Программа должна быть одной строкой, вы предоставили вектор из трех символьных строк.Другой способ выразить это 'length (pattern)' должен быть '1'. Кроме того, 'function (m) grep (" XXX [i] "), m))' имеет неуместную закрытую paranthesis после "XXX [i]" '. Снова проверьте документацию по grep и ее примерам. –

ответ

1

Из документации для pattern= аргумента в функции grep():

Строка символов, содержащая регулярное выражение (или строку символов для fixed = TRUE), чтобы быть согласованной в данном векторе символов. Прибегает к as.character символьной строке, если это возможно. Если задан вектор символа длиной 2 или более, первый элемент используется с предупреждением. Недопустимые значения допустимы, за исключением regexpr и gregexpr.

Это подтверждает, что, как сказал @nrussell в комментарии, grep() не прорисовывается над аргументом шаблона. Из-за этого c() не будет работать для списка регулярных выражений.

Вы можете, однако использовать цикл, вам просто нужно изменить свой синтаксис.

toMatch <- c("A1", "A9", "A6") 

# Loop over values to match 
for (i in toMatch) { 
    grep(i, text) 
} 

Использование "XXX[i]", как ваша модель не работает, потому что это толкование, что в качестве регулярного выражения. То есть, он будет точно соответствовать XXXi. Чтобы ссылаться на элемент вектора регулярных выражений, вы просто используете XXX[i] (обратите внимание на отсутствие окружающих цитат).

Это может быть apply(), но несколько иначе, чем вы сделали. Вы применяете его к каждому regex в списке, а не к каждой текстовой строке.

lapply(toMatch, function(rgx, text) grep(rgx, text), text = text) 

Однако, лучший подход был бы, как и у вас уже есть в вашем посте, чтобы использовать

matches <- unique(grep(paste(toMatch, collapse = "|"), text)) 
0

Считают, что:

XXX <- c("a", "b", "XXX[i]") 
grep("XXX[i]", XXX, value=T) 
character(0) 
grep("XXX\\[i\\]", XXX, value=T) 
[1] "XXX[i]" 

Что R делает? Он использует специальные правила для первого аргумента grep. Скобки считаются специальными символами ([ и ]). Я положил две обратную косую черту, чтобы сказать R рассмотреть их обычные скобки. И imgaine, что произойдет, если я добавлю это последнее выражение в цикл for? Это не сделало бы того, чего я ожидал.

Если вы хотите, чтобы цикл for проходил через вектор символов возможных совпадений, выньте кавычки в функцию grep.

#if you want the match returned 
matches <- c("a", "b") 
for (i in matches) print(grep(i, XXX, value=T)) 
[1] "a" 
[1] "b" 

#if you want the vector location of the match 
for (i in matches) print(grep(i, XXX)) 
[1] 1 
[1] 2 

В комментарии указывают, grep(c("A1","A2","A3"),m)) является нарушением grep необходимый синтаксис.

Смежные вопросы