2017-12-11 6 views
7

sind Ich versuche, die Anzahl der eindeutigen Drogen in dieser Liste zu zählen.Zählen einzigartige Elemente, wenn einige Synonyme voneinander

my_drugs=c('a', 'b', 'd', 'h', 'q') 

Ich habe folgendes Wörterbuch, das mir Droge Synonyme gibt, aber es nicht gesetzt ist, so dass die Definitionen nur für einzigartige Medikamente sind:

dictionary <- read.table(header=TRUE, text=" 
    drug names 
    a b;c;d;x 
    x b;c;q 
    r h;g;f 
    l m;n 
") 

So in diesem Fall gibt es 2 einzigartige Medikamente in der Liste (weil ein, entweder direkt oder indirekt, aufweist Synonyme b, d, q). Synonyme von Synonymen gelten als Synonyme.

war mein versucht Ansatz, zuerst ein Wörterbuch, die nur einmalige Drogen auf der linken Seite hatte. Um dies zu tun, würde ich durch das Wörterbuch $ droge, grep im Wörterbuch $ Drogen und Wörterbuch $ Synonyme, nehmen Sie die Vereinigung von denen und ersetzen Sie Drogen $ Synonyme, und löschen Sie dann die anderen Zeilen aus dem Wörterbuch.

bigdf=dictionary 

    small_df=data.frame("drug"=NA,"names"=NA) 

    for(i in 1:nrow(bigdf)){ 
    search_term=sprintf("*%s*",bigdf$drug[i]) 
    index=grep(search_term,bigdf$names) 
    list=bigdf$names[index] 
    list=Reduce(union,list) 
    list=paste(list, collapse=";") 

    if(!list==""){ 

    new_row=data.frame("drug"=bigdf$drug[index][1],"names"=list) 
    small_df=rbind(small_df,new_row) 
    #small_df 
    bigdf=bigdf[-index,] 
    #dim(bigdf) 

    } 
    else{ 
     new_row=data.frame("drug"=bigdf$drug[index][1],"names"="alreadycounted") 
     small_df=rbind(small_df,new_row) 
    }  
    } 

Diese arbeiten nicht (einige Medikamente aus small_df fehlten), und selbst wenn es hatte ich nicht sicher bin, wie ich mein neues Wörterbuch verwendet haben, würde die Anzahl der eindeutigen Drogen in meiner Liste zu zählen.

Wie kann ich die Anzahl der eindeutigen Drogen in my_drugs zählen?

Vielen Dank für Ihre Hilfe, und lassen Sie mich wissen, wenn dies weiterer Klärung bedarf.

Datensatzgröße: 200 Elemente in my_drugs, 2000 Zeilen im Wörterbuch, jede Droge hat 10-12 Synonyme.

+0

Sie könnten ein Netz/Diagramm mit Verbindungen zwischen Namen betrachten, wenn sie Synonyme sind. Zum Beispiel https://stackoverflow.com/q/30407769/ – Frank

Antwort

1
library(igraph) 
df1 = unique(data.frame(do.call(
    rbind, apply(X = dictionary, 
       MARGIN = 1, 
       FUN = function(x) t(combn(unlist(strsplit(x, ";")), 2, sort)))))) 
g = graph.data.frame(df1) 
g2 = delete.vertices(g, unique(V(g)$name)[!unique(V(g)$name) %in% my_drugs]) 
clusters(g2)$no 
#[1] 2 
Verwandte Themen