2016-07-09 74 views
0

R函數grep!grep(NOT grep)在邏輯上不一致;與邏輯上一致的grepl!grepl(不是grepl)不同。當grep和!grepl在邏輯上一致時,爲什麼在R中grep&!grep在邏輯上不一致?

grepl返回一個長度與正在搜索的項目數量相等的邏輯向量。例如,如果目標是在5項向量的項目2和3發現了以下則返回:

FALSE TRUE TRUE FALSE FALSE 

如果grepl!grepl替換,那麼「相反」邏輯結果返回:

TRUE FALSE FALSE TRUE TRUE 

grep,在另一方面返回找到的項目2個位置的向量:2 3

什麼在相同的情況下!grep回報?從邏輯上講,它應該返回1 4 5,而不是返回FALSE FALSE。這怎麼可能是一個邏輯上一致的返回值?誰能解釋一下?

+1

由於'grep'返回'integer's的0+載體中,'!'(倒相邏輯電路)操作者未在他們定義。你能肯定地告訴我什麼'invert_logic 5:7'意味着什麼? (如果你知道矢量的長度,那麼你可以推斷'1:4,8:n',但那是放肆的。)由於'grepl'返回一個0+的邏輯矢量,所以說' invert_logic c(T,T,F,T)',並且由於您使用相同長度的邏輯向量(倒置或其他)對索引進行索引,所以您很好。 (順便說一下:''[-grep(「[fh]」,letters]'實際上是反轉的。) – r2evans

+1

嘗試'grep(...,invert = TRUE)'。我想這就是你想要的。 –

+0

1)'grep '返回與模式匹配的索引,而'grepl'返回一個邏輯向量; 2)'!'操作符將其參數強制爲'logical'。例如,嘗試'!c(0,2,4)',你會發現它相當於'!as.logical(c(0,2,4))'; 3)檢查'grep'的'invert'參數。 – nicola

回答

4

您在尋找grep()invert參數。

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(value = FALSE) - 返回產生匹配的x的元素索引的向量。

grepl返回一個邏輯向量(匹配或不匹配x的每個元素)。

grep vs grepl in R