2013-01-23 1 views
10

나는 겉으로는 매우 간단하게 뭔가를 찾고 있습니다. grepl() 명령을 사용하여 R의 데이터 프레임을 하위 집합으로 만들거나 루프를 구성하지 않고 여러 다른 구에서 하위 프레임을 만들고 싶습니다.grepl()을 사용하는 문자열 목록을 기반으로 한 서브 세트?

예를 들어, 내가 누구라는 이름의 밥이나 마리아에 대한 모든 행을 꺼내 싶습니다

## example data frame: 
tmp = structure(list(Name = structure(c(6L, 8L, 9L, 7L, 2L, 3L, 10L, 
1L, 5L, 4L), .Label = c("Alan", "Bob", "bob smith", "Frank", 
"John", "Mary Anne", "mary jane", "Mary Smith", "Potter, Mary", 
"smith, BOB"), class = "factor"), Age = c(31L, 23L, 23L, 55L, 
32L, 36L, 45L, 12L, 43L, 46L), Height = 1:10), .Names = c("Name", 
"Age", "Height"), class = "data.frame", row.names = c(NA, -10L 
)) 

tmp 

#   Name Age Height 
#1  Mary Anne 31  1 
#2 Mary Smith 23  2 
#3 Potter, Mary 23  3 
#4  mary jane 55  4 
#5   Bob 32  5 
#6  bob smith 36  6 
#7 smith, BOB 45  7 
#8   Alan 12  8 
#9   John 43  9 
#10  Frank 46  10 

## this doesn't work 
mynames=c('bob','mary') 
tmp[grepl(mynames,tmp$Name,ignore.case=T),] 

어떤 아이디어가 도움이 될 것입니다!

+0

당신은 콘솔에 경고를 받고되어야한다. '? grep' 문서는 "길이가 2 이상인 문자 벡터가 제공되면, 첫 번째 요소는 경고와 함께 사용됩니다." –

답변

26

mynames 벡터와 정규식 연산자 |을 결합하여 grep을 사용할 수 있습니다. 기능의`grep` 가족 패턴 (고정 문자열이나 정규 표현식 중 하나)를 지정하는 단일 문자열을 필요로하기 때문에

tmp[grep(paste(mynames, collapse='|'), tmp$Name, ignore.case=TRUE),] 

#   Name Age Height 
# 1 Mary Anne 31  1 
# 2 Mary Smith 23  2 
# 3 Potter, Mary 23  3 
# 4 mary jane 55  4 
# 5   Bob 32  5 
# 6 bob smith 36  6 
# 7 smith, BOB 45  7 
+4

@Justin here'|'는 논리 연산자가 아니지만 정규 표현식 대체 연산자가 아닙니다. 예를 들어, paste (mynames, collapse = "&")는 예상했던대로 작동하지 않습니다. – hadley

+0

@hadley 맞습니다! 그에 따라 편집하겠습니다. – Justin

관련 문제