2017-12-11 100 views
7

Tôi đang cố gắng đếm số lượng thuốc độc nhất trong danh sách này.Đếm các yếu tố độc đáo khi một số là từ đồng nghĩa của nhau

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

Tôi có Từ điển sau đây, mà mang lại cho tôi từ đồng nghĩa ma túy, nhưng nó không được thiết lập để các định nghĩa chỉ dành cho các loại thuốc duy nhất:

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

Vì vậy, trong trường hợp này, có 2 các loại thuốc độc nhất trong danh sách (vì a, hoặc trực tiếp hoặc gián tiếp, có các từ đồng nghĩa b, d, q). Từ đồng nghĩa của các từ đồng nghĩa được tính là từ đồng nghĩa.

Cách tiếp cận cố gắng của tôi là tạo một từ điển đầu tiên chỉ có các loại thuốc độc đáo ở phía bên trái. Để làm điều này, tôi sẽ chuyển qua từ điển $ drug, grep trong từ điển $ drug và từ điển $ synonyms, lấy liên minh của những người đó và thay thế $ dictionary từ đồng nghĩa, và sau đó xóa các hàng khác khỏi từ điển.

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

này đã không làm việc (một số thuốc bị mất tích từ small_df), và thậm chí nếu nó có Tôi không chắc chắn làm thế nào tôi có thể đã sử dụng từ điển mới của tôi để đếm số lượng các loại thuốc duy nhất trong danh sách của tôi.

Làm cách nào để tính số lượng thuốc độc nhất trong my_drugs?

Cảm ơn sự giúp đỡ của bạn và cho tôi biết nếu điều này cần làm rõ thêm.

Kích thước tập dữ liệu: 200 phần tử trong my_drugs, 2000 hàng trong từ điển, mỗi loại thuốc có từ 10-12 từ đồng nghĩa.

+0

Bạn có thể cân nhắc xem mạng/biểu đồ có kết nối giữa các tên nếu chúng là từ đồng nghĩa. Ví dụ: https://stackoverflow.com/q/30407769/ – Frank

Trả lời

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 
Các vấn đề liên quan