2016-07-26 6 views
2

많은 요소가 포함 된 벡터와 문자열이 포함 된 데이터 프레임의 열 사이의 일치를 확인하려고합니다.sapply 및 grepl을 사용하여 벡터를 여러 문자열에 일치시킬 때 토큰 추가

> x 
     KIND Quest 
[1,] TRUE FALSE 
[2,] TRUE FALSE 
[3,] TRUE FALSE 
[4,] FALSE TRUE 
[5,] FALSE TRUE 

문제는 'lieberkind'에 대한 TRUE 값을 생성 끝 "종류"에 대한 최초의 결과이다 :

vec <- c("KIND", "Quest") 

string <- ("lieberkind", "kind", "KIND", "Quest Nutrition", "Quest") 

x <- sapply(vec, function (x) grepl(x, string, ignore.case = TRUE)) 

의 결과이다.

일반적으로는, 그냥 같은 단어 경계 지정하는 토큰을 추가 한 것 :

grepl("\\bKIND\\b", string, ignore.case = TRUE) 
[1] FALSE TRUE TRUE FALSE FALSE 

을하지만 난에 대해 벡터의 각 요소를 비교하는 sapply을 사용하고 때 할 수있는 방법을 모른다 문자열의 각 요소

나는 분명히이 작업을 수행 할 수 없습니다

:

x <- sapply(vec, function (x) grepl(\\bx\\b, string, ignore.case = TRUE)) 

어떻게이 문제를 해결할 수 있습니까?

+1

'\\ bx \\ b' 대신'paste0 ("\\ b", x, "\\ b")'일 가능성이 있습니까? 모든 항목이 영숫자입니까? –

+2

'sprintf ("\\ b % s \\ b", vec)' – Jota

+0

예, 모든 항목은 영숫자입니다! – vagabond

답변

2

단어 경계를 확인하는 데는 여러 가지 방법이 있으며, 이는 데이터에 따라 다릅니다. 다음, (아니 시작이나 끝에 주)

x <- sapply(vec, function (x) grepl(sprintf("\\b%s\\b", x), string, ignore.case = TRUE)) 

그러나 당신의 vec 특별한 내부 문자 항목을 포함하는 경우 : 당신이 단어 경계를 사용해야하는 경우,

x <- sapply(vec, function (x) grepl(paste0("\\b",x,"\\b"), string, ignore.case = TRUE)) 

또는 Jota's recommended equivalent로 사용 당신은/문자열의 끝을

x <- sapply(vec, function (x) grepl(paste0("\\b",gsub("([][/\\\\^$*+?.()|{}-])", "\\\\\\1", x),"\\b"), string, ignore.case = TRUE)) 

처럼 뭔가를 탈출 그리고 마지막으로, 당신은 공백 문자로 단어 경계를 정의하는 경우 또는 시작해야합니다, I

 KIND Quest 
[1,] FALSE FALSE 
[2,] TRUE FALSE 
[3,] TRUE FALSE 
[4,] FALSE TRUE 
[5,] FALSE TRUE 

추신 : '이 아니라 테스트 데이터의 모든 3의 경우 결과는 같을 것이다 PCRE는

x <- sapply(vec, function (x) grepl(paste0("(?<!\\S)",gsub("([][/\\\\^$*+?.()|{}-])", "\\\\\\1", x),"(?!\\S)"), string, ignore.case = TRUE, perl=TRUE)) 

같은 정규식 추천 거라고 paste0 또는 sprintf에 관계없이 동일한 결과를 얻을 수 있습니다.