2017-12-11 131 views
7

Bu listedeki benzersiz ilaç sayısını saymaya çalışıyorum.Bazılarının birbirinin eşanlamlıları olduğunda benzersiz öğeleri sayma

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

Ben bana uyuşturucu eş anlamlılarını verir ama tanımlamalar yalnızca benzersiz ilaçlar için böylece o kurulmamış aşağıdaki sözlük,: bu durumda Yani

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

, orada 2 Listedeki benzersiz ilaçlar (doğrudan ya da dolaylı olarak a, b, d, q ile eşanlamlıdır). Eş anlamlıların eşanlamlıları eş anlamlı olarak sayılır.

Girişimdeki yaklaşımım, öncelikle sol tarafta yalnızca benzersiz ilaçların bulunduğu bir sözlük yapmaktı. Bunu yapmak için, dictionary $ ilacı, grep in dictionary $ uyuşturucu ve dictionary $ eşanlamlıları arasında dolaşır, bunların birliğini alır ve $ synonyms ilacını değiştirir ve sonra diğer satırları sözlükten silerim.

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) 
    }  
    } 

Bu (bazı ilaçlar small_df kaybolduğunu) işe yaramadı ve o benim listesindeki benzersiz ilaçların sayısını saymak için benim yeni sözlüğünü kullanılmış olurdu emin değilim olsa bile.

My_drugs'da benzersiz ilaçların sayısını nasıl sayabilirim?

Yardımlarınız için teşekkür ederiz ve bunun daha fazla açıklama gerektirmesi durumunda bana bildirin.

Veri Kümesi Boyutu: my_drugs'da 200 öğe, sözlükte 2000 satır, her ilacın 10-12 eş anlamlısı vardır.

+0

Eş anlamlılarsa, adlar arasındaki bağlantılarla bir ağa/grafiğe bakmayı düşünebilirsiniz. Örneğin https://stackoverflow.com/q/30407769/ – Frank

cevap

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 
İlgili konular