2010-10-28 96 views
2

我能做到以下幾點:排除從字符向量元素FALSE,利用邏輯矢量

stuff <- c("banana_fruit","apple_fruit","coin","key","crap") 
fruits <- stuff[stuff %in% grep("fruit",stuff,value=TRUE)] 

,但我不能用通常的想法和意見一樣選擇 - 不那麼健康的東西

no_fruit <- stuff[stuff %not in% grep("fruit",stuff,value=TRUE)] 
#or 
no_fruit <- stuff[-c(stuff %in% grep("fruit",stuff,value=TRUE))] 

不起作用。後者只是忽略了「 - 」

+0

你可能希望把HTTP這樣的問題://stats.stackexchange。 com/ – 2010-10-28 13:37:52

+2

@Dave:這個問題不是統計相關的。 – 2010-10-28 13:43:50

+0

它被標記爲「R」,並且在那裏我回答了很多與R有關的問題,但也許不是那些與這裏的語法完全相關的問題。 – 2010-11-01 10:20:27

回答

4
> stuff[grep("fruit",stuff)] 
[1] "banana_fruit" "apple_fruit" 
> stuff[-grep("fruit",stuff)] 
[1] "coin" "key" "crap" 

您只能使用負下標有數字/整數向量,不符合邏輯,因爲:

> -TRUE 
[1] -1 

如果你想否定一個合乎邏輯的載體,應用!

> !TRUE 
[1] FALSE 
+0

好的,我明白了。我想我需要百分之%的語法,但爲了得到可能適用於子集的邏輯值。有沒有辦法反轉邏輯矢量?這意味着TRUE變成FALSE,反之亦然? – 2010-10-28 13:35:57

+3

@ran:使用'!'來做到這一點,或者只是使用'grepl'來代替。 – 2010-10-28 13:37:45

+0

只是好奇:是否有一個通用的方法來做到這一點?我的意思是外部grep或子集? – 2010-10-28 13:40:49

2

約書亞提到的:你不能用-否定你的邏輯索引;改爲使用!

stuff[!(stuff %in% grep("fruit",stuff,value=TRUE))] 

另請參閱stringr包裝爲這種事情。

stuff[!str_detect(stuff, "fruit")] 
+1

並參見'grepl'。 – hadley 2010-10-28 19:19:05

1

還有一個在grep的所謂的「倒置」的參數,它基本上是你在找什麼:

> stuff <- c("banana_fruit","apple_fruit","coin","key","crap") 
> fruits <- stuff[stuff %in% grep("fruit",stuff,value=TRUE)] 
> fruits 
[1] "banana_fruit" "apple_fruit" 
> grep("fruit", stuff, value = T) 
[1] "banana_fruit" "apple_fruit" 
> grep("fruit", stuff, value = T, invert = T) 
[1] "coin" "key" "crap"