2013-08-02 1 views
1

난 항상 같은 명령으로 일하고 있어요 함수 내 코드를 정리하고 다음과 같이하십시오 :결합 논리 문은

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

그러나이 중 아무 것도 작동하지 않습니다! 나는 간단한 해결책이 있어야한다고 확신한다. 나는 그것을 찾을 수 없다. 나는 ifelse() 함수에서 같은 문제가 있으므로 보편적 인 솔루션에 대한 권리를 자랑하고있다. grep의 논리적 버전을 사용

답변

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 - 그 마지막 비트의 alternate (* preferred * IMHO) 디자인은 논리적으로 저장하는 것입니다 :'foo $ in.ABC <- foo $ bar % in % LETTERS [1 : 3]' – flodel

0

: -

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]을"해야합니다 존재하는 경우 문제가 생각하여 which

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

C) , 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를 사용

))을 사용하여 match

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