2017-01-04 10 views
2

私は、特定の製品を識別するためにビルドした "キーワード"のリストを実行する必要がある複数の調達データベースを持っています。製品を外科的カテゴリーに分類する。R部分文字列一致と戻り値(R)

ここは例です。

調達データベース(実際には、私はオーバー行くことは2,000,000行以上のものを持っている):キーワードおよび戻り値の

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に関連付けられたcategoryを返す列を追加したいと思いますkwデータフレーム。

は、今の私は、次のコードを使用して所望の結果を達成することができました:

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

をしかし、私は約30の異なるカテゴリにマッピングされている約350のキーワードを持っているので、このコードは実際には効率的ではありません。キーワードの1つがトリガーされた場合、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> 
関連する問題