当某些元素是彼此的同义词时计算唯一元素
Counting unique elements when some are synonyms of each other
我正在计算此列表中独特药物的数量。
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,grep in dictionary$drug 和 dictionary$synonyms,将它们合并并替换 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 个同义词。
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
我正在计算此列表中独特药物的数量。
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,grep in dictionary$drug 和 dictionary$synonyms,将它们合并并替换 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 个同义词。
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