2013-08-02 69 views
1

我總是命令如下工作:組合邏輯陳述功能

which(foo$bar == 'A' | foo$bar == 'B' | foo$bar == 'C') 

因爲它們都涉及到同一個變量,我想能夠清理我的代碼,做這樣的事情:

which(foo$bar == 'A|B|C') # such syntax works in grep, why not here? 
# or... 
which(foo$bar == c('A', 'B', 'C')) 

但這一切作品!我很確定必須有一個簡單的解決方案,我找不到它。我在ifelse()函數中遇到了同樣的問題,所以獎金吹噓權利爲通用解決方案。

回答

9
with(foo, which(bar %in% LETTERS[1:3])) 

可用於從一個數據幀中選擇行。它也有可能以此爲邏輯指數報告載體,雖然與邏輯索引你需要記住,R指數不爲0,基於:

set.seed=(123) 
    foo <- data.frame(bar=sample(LETTERS[1:15], 10)) 
    c("Not in A|B|C", "In A|B|C") [ 1+ foo$bar %in% LETTERS[1:3] ] 
+0

+1 - 備用(*首選*恕我直言)設計的最後一點是存儲爲邏輯:'foo $ in.ABC < - foo $ bar%in%LETTERS [1:3]' – flodel

0

使用的grep邏輯版本:

foo <- letters[1:5] 
foo[grepl("[a-c]", foo)] 
seq_along(foo)[grepl("[a-c]", foo)] 

你的第二個問題 - 這是你追求的:

ifelse (sum(grepl("[a-c]", foo))==3, "abc present", "abc absent") 

(使用sum邏輯轉換爲數值)

或者如果有任何字母存在,請採取措施:

if (any(letters[1:3] %in% foo)) print("abc present") 
+1

我認爲問題是,如果它們中的任何存在,則代碼將有一個小的變化 ifelse(總和(grepl( 「[AC]」 ,foo))> 0,「abc present」,「abc absent」) –

+0

謝謝,好點。 – dardisco

2

按@baptiste

mydata<-structure(list(y = c("A", "B", "C", "D", "E")), 
    .Names = "y", class = "data.frame", row.names = c(NA, -5L)) 
mydata 
    y 
1 A 
2 B 
3 C 
4 D 
5 E 

三種解決方法:使用ifelse

with(mydata,ifelse(y %in% c("A","B","C"),1,0)) 

b

a))的使用which

with(mydata,which(y %in% c("A","B","C"))) 

c)使用match

with(mydata,match(y,c("A", "B", "C")))