2016-07-09 13 views
0

Функции R grep и !grep (NOT grep) не являются логически последовательными; в отличие от grepl и !grepl (НЕ grepl), которые логически согласованы.Почему в R grep &! Grep не логически последовательны, когда grepl и! Grepl Являются логически последовательными?

grepl возвращает логический вектор, равный по длине количеству элементов, которые ищутся. Например, если цель находится в пунктах 2 и 3 вектора 5 пункта следующий возвращаются:

FALSE TRUE TRUE FALSE FALSE 

Если grepl заменяются !grepl, то «обратный» логический результат возвращается:

TRUE FALSE FALSE TRUE TRUE 

grep, с другой стороны возвращает вектор из 2-х позиций найденных элементов: 2 3

Что !grep возвращения в том же сценарии? Логически он должен возвращать 1 4 5, вместо этого он возвращает FALSE FALSE. Как это может быть логически последовательное возвращаемое значение? Может ли кто-нибудь объяснить?

+1

Поскольку 'grep' возвращает 0+ вектор' integer's, то! '(Инвертирование) оператор' не определен на них. Можете ли вы с уверенностью сказать, что означает 'invert_logic 5: 7'? (Если вы знаете длину вектора, то вы можете вывести '1: 4,8: ​​n', но это самонадеянно.) Поскольку' grepl' возвращает вектор 0+ 'logical', имеет смысл сказать ' invert_logic c (T, T, F, T) ', и поскольку вы индексируете вектор с вектором логики одинаковой длины (инвертированный или иным образом), вы хороши. (BTW: 'letters [-grep (" [fh] ", letters]' эффективно инвертирует.) – r2evans

+1

Попробуйте 'grep (..., invert = TRUE)'. Я думаю, это то, что вы хотите. –

+0

1) 'grep 'возвращает индексы, соответствующие шаблону, в то время как' grepl' возвращает логический вектор; 2) оператор '!' Принуждает свой аргумент к «логическому». Попробуйте '! C (0,2,4)' например, и вы увидите, что это эквивалентно '! As.logical (c (0,2,4))'; 3) проверьте аргумент 'invert'' grep'. – nicola

ответ

4

Вы ищете аргумент invert для grep().

Из help(grep) под Аргументы:

инвертный - логический. Если TRUE вернуть индексы или значения для элементов, которые делают не матч.

Звучит как именно то, что вы хотите. Давайте посмотрим пример.

x <- c("ab", "cd", "bc", "def", "abc") 

grep("b", x) 
# [1] 1 3 5 
grep("b", x, invert=TRUE) 
# [1] 2 4 
0

Grep (значение = FALSE) - возвращает вектор индексов элементов х, которые давали матч.

grepl возвращает логический вектор (соответствует или нет для каждого элемента x).

grep vs grepl in R

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

  • Нет связанных вопросов^_^