【问题标题】:Counting unique elements when some are synonyms of each other当一些是彼此的同义词时计算唯一元素
【发布时间】:2017-12-11 18:19:22
【问题描述】:

我正在尝试计算此列表中独特药物的数量。

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

我有以下字典,它给了我药物同义词,但它没有设置,因此定义仅适用于独特的药物:

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

所以在这种情况下,列表中有 2 种独特的药物(因为 a,无论是直接还是间接,都有同义词 b、d、q)。同义词的同义词算作同义词。

我尝试的方法是首先制作一个仅在左侧有独特药物的字典。为此,我将遍历字典$drug,在字典$drug 和字典$synonyms 中进行 grep,取它们的并集并替换 drug$synonyms,然后从字典中删除其他行。

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

这不起作用(small_df 中缺少一些药物),即使有,我也不确定如何使用我的新字典来计算列表中独特药物的数量。

如何计算 my_drugs 中独特药物的数量?

感谢您的帮助,如果需要进一步说明,请告诉我。

数据集大小:my_drugs 中 200 个元素,字典中 2000 行,每种药物有 10-12 个同义词。

【问题讨论】:

标签: r unique overlap synonym


【解决方案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

【讨论】:

    猜你喜欢
    • 2011-03-14
    • 2021-06-02
    • 2015-04-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-28
    • 1970-01-01
    相关资源
    最近更新 更多