2017-01-04 9 views
2

특정 제품을 식별하기 위해 빌드 한 "키워드"목록을 실행해야하는 여러 조달 데이터베이스가 있으며 일치하는 항목에 태그를 지정하고 싶습니다 제품을 외과 범주로 분류합니다.R 부분 문자열 일치 및 반환 값 (R)

다음은 예입니다.

조달 데이터베이스 (사실 내가 가서하는 200 라인 이상이) : (더 이상 실제 목록) 키워드와 반환 값의

d<-data.frame(prod_desc=c("BANDELETTE TVTO-OBTRYX HALO", "BANDELETTE MINI ARC PRECISES", "BANDELETTE D'ANALYSE POUR GLYCEMIE", "DIACH. BANDELETTE STER 19MM X 72MM","SLING MALE SYSTEM","DIACHILON","AIGUILLE","GANT","LABEL","CRAYON"),label=1:10) 

목록 :

kw<-data.frame(kw=c("bandelette","tvt","bande transvaginale","sling system","argus"),category="ss_bandelette") 

내가 좋아하는 것 내 키워드 문자열 kw이 포함 된 prod_desc 제품을 찾으십시오. 일치하는 항목이 있다면 d 데이터 프레임에 을 반환하는 데이터 프레임에 열을 추가하고 싶습니다. kw 데이터 프레임

은 지금 나는 다음과 같은 코드를 사용하여 원하는 결과를 얻을 수 있었다 :

d$match <- ifelse(d$cat <- grepl(paste(kw$kw,collapse="|"), d$name,ignore.case = TRUE) == "TRUE","SS_Bandelette","-") 

을하지만 30 다른 카테고리에 매핑되는 약 350 키워드를 갖고 있기 때문에이 코드는 정말 효율적이지 않습니다. 내 키워드 중 하나가 트리거되면 어떤 코드를 사용하여 d 데이터 프레임에 카테고리를 자동으로 반환 할 수 있습니까?

는 당신의 도움을 주셔서 감사합니다. 나는이 질문을 생각 @DarshanBaral

+1

이 다릅니다. 심지어 나는 더 일찍 생각했다. 나는 대답을 게시했다 –

답변

1
# made all to lowercase 
d$prod_desc <- tolower(d$prod_desc) 
# create a logical matrix that specifies which keywords are present on each row of 'd' 
m = data.frame(sapply(kw$kw, grepl, d$prod_desc)) 
colnames(m) = kw$kw 

# create a column in 'd' with the corresponding keyword  
d$kw <- apply(m, 1, function(x) names(x)[which(x)[1]]) 
# simple merge 
merge(d, kw, by = "kw", all.x = T) 

#   kw       prod_desc label  category 
#1 bandelette bandelette d'analyse pour glycemie  3 ss_bandelette 
#2 bandelette diach. bandelette ster 19mm x 72mm  4 ss_bandelette 
#3 bandelette  bandelette tvto-obtryx halo  1 ss_bandelette 
#4 bandelette  bandelette mini arc precises  2 ss_bandelette 
#5  <NA>     sling male system  5   <NA> 
#6  <NA>       diachilon  6   <NA> 
#7  <NA>       aiguille  7   <NA> 
#8  <NA>        gant  8   <NA> 
#9  <NA>        label  9   <NA> 
#10  <NA>        crayon 10   <NA> 
+0

@PhilippeLachapelle 내가 맞는지 모르겠다. 추위에 당신이 진짜 데이터를 테스트하고 –

+0

조엘, 정말 고마워. 아름답게 작동합니다. 빠른 답변 주셔서 감사합니다. 나는 지금 당신의 코드를 공부할 것이다! 문안 인사. PL –

+0

@PhilippeLachapelle 마음이 이것을 통과합니다. http://stackoverflow.com/help/someone-answers –

0
# Create dataframe as per original question 
d<-data.frame(prod_desc=c("BANDELETTE TVTO-OBTRYX HALO", "BANDELETTE MINI ARC PRECISES", "BANDELETTE D'ANALYSE POUR GLYCEMIE", "DIACH. BANDELETTE STER 19MM X 72MM","SLING MALE SYSTEM","DIACHILON","AIGUILLE","GANT","LABEL","CRAYON"),label=1:10) 
# Create keywords as per origianl question 
kw<-data.frame(kw=c("bandelette","tvt","bande transvaginale","sling system","argus"),category="ss_bandelette") 
# Assume you want match/tag string on word boundaries? If not; "BANDELETTE TVTO-OBTRYX HALO" would match to "tvt" for instance. 
kw$kw <- paste0("\\b",kw$kw,"\\b") 

x <- sapply(kw$kw, function(x) grepl(tolower(x), tolower(d$prod_desc))) 
d$Match <- apply(x, 1, function(i) paste0(names(i)[i])) 
d$Match <- kw$category[match(d$Match,kw$kw)] 
d 
#        prod_desc label   Match 
# 1   BANDELETTE TVTO-OBTRYX HALO  1 ss_bandelette 
# 2  BANDELETTE MINI ARC PRECISES  2 ss_bandelette 
# 3 BANDELETTE D'ANALYSE POUR GLYCEMIE  3 ss_bandelette 
# 4 DIACH. BANDELETTE STER 19MM X 72MM  4 ss_bandelette 
# 5     SLING MALE SYSTEM  5   <NA> 
# 6       DIACHILON  6   <NA> 
# 7       AIGUILLE  7   <NA> 
# 8        GANT  8   <NA> 
# 9        LABEL  9   <NA> 
# 10        CRAYON 10   <NA>