2017-09-04 9 views
0

私は既に登録されている薬の名前を持つテキストベクトルと、新薬の名前を持つテキストベクトルを持っています。私は、新薬がすでに存在する薬物のように見えるかどうかを知りたい。サプリで重複する名前を変更しないでください。

たとえば、firm1またはfirm2のいずれかで生産可能な薬物であり、supercure firm1 1000mgおよびsupercure firm2 500mgが既に登録されている薬物である場合は、supercure firm1 500 mgを両方とも関連付ける必要があります。

agrepはRで、このようなマッチングを行うことができます、とsapplyは、新しいリスト内のすべての薬のためにそれを行うことができます:

new<-c("supercure firm1 500mg","randomcure firm2 1000mg","unknowncure firm2 100mg") 
registered<-c("supercure firm1 1000mg","supercure firm2 500mg","randomcure firm1 1000mg") 
res<-unlist(sapply(new,agrep,x=registered)) 
res 

予想したように、supercureは(2試合、randomcure 1試合を取得し、一致をunknowncureありませんそれは私が望むものです)。ただし、重複がないようにsapplyには名前が変更されているように表示されます。

:それは、新しいリストからマッチした薬を選択するために、私を防ぐため、これは問題がある

supercure firm1 500mg1 supercure firm1 500mg2 randomcure firm2 1000mg 
        1      2      3 

supercure firm1 500mgsupercure firm1 500mg1supercure firm1 500mg2になりましたnew[new %in% names(res)]はrandomcureを捕まえます(supercureの名前が変更されているため)。

私はこれを非常に無慈悲なテキスト処理で修正する方法を考えることはできますが、マッチした新薬のリストを得るもっと巧妙な方法がありますか?

理想的な出力は次のようになります。

supercure firm1 500mg supercure firm1 500mg randomcure firm2 1000mg 
        1      2      3 

答えて

1

sapply」をdidnの名前を変えて、unlistしました。これにより、望ましい出力が得られます。

x <- sapply(new,agrep,x=registered) 
setNames(unlist(x),rep(names(x),lengths(x))) 
# supercure firm1 500mg supercure firm1 500mg randomcure firm2 1000mg 
#      1      2      3 
+0

確かに、私の悪い。ここでニースのソリューション! – Vincent

1

あなたはそれがstack、そのデータフレームを作ってみると、それ命名ベクトル作るためにsetNamesを使用することができ、すなわち

d1 <- unique(stack(data.frame(Filter(length, sapply(new,agrep,x=registered))))) 
# values      ind 
#1  1 supercure.firm1.500mg 
#2  2 supercure.firm1.500mg 
#3  3 randomcure.firm2.1000mg 

setNames(d1$values, d1$ind) 
# supercure.firm1.500mg supercure.firm1.500mg randomcure.firm2.1000mg 
#      1      2      3 
+0

本当にありがとうございます! – Vincent

関連する問題