2016-03-08 71 views
0

元件I具有兩個元素:R:選擇從列表

id1 <- "dog" 
id2 <- "cat" 

我想從一個向量

L <- c("gdoaaa","gdobbb","gfoaaa","ghobbb","catdog") 
L 

我試圖提取這些元素(dogcat或catddog)的任意組合:

L[grep(paste(id1,id2,sep="")),L] 
L[grep(paste(id2,id1,sep="")),L] 

但這給出了一個錯誤。

我會很感謝您的幫助,糾正上述情況。

+1

'L [grep的(貼(ID1,ID2,九月= 「」),L)] L [grep的(醬(ID2,ID1,九月=「」),L)]' – HubertL

+2

簡單的非正則表達式解決方案可以是'grepl(id1,L)&grepl(id2,L)'。如果效率很重要,您可以將'fixed = TRUE'添加到兩者。 –

+0

我不明白,但顯然'grepl(「(dog(cat)?)」,L)'禮貌http://stackoverflow.com/questions/1177081/mulitple-words-in-any-order -using-regex – thelatemail

回答

2

錯誤來自錯位的圓括號,因此您的代碼上的這些細微變化將起作用。

L[grep(paste(id1,id2,sep=""), L)] 
# character(0) 
L[grep(paste(id2,id1,sep=""), L)] 
# [1] "catdog" 

或者這是一個正則表達式的一行:

L[grep(paste0(id2, id1, "|", id1, id2), L)] 
# [1] "catdog" 

這一點和評論的一些模式也將匹配dogcatt。爲了避免這種情況,你可以使用^$像這樣:

x <- c("dogcat", "foo", "catdog", "ddogcatt") 
x[grep(paste0("^", id2, id1, "|", id1, id2, "$"), x)] 
# [1] "dogcat" "catdog"