0

我有一个带有已注册药物名称的文本向量,另一个带有新药物名称的文本向量。我想知道新药是否看起​​来像已经存在的药物。

例如,如果 supercure 是一种可以由公司 1 或公司 2 生产的药物,并且supercure firm1 1000mg已经supercure firm2 500mg注册,那么supercure firm1 500 mg应该与他们两者相关联。

agrep允许在 R 中进行这种匹配,并sapply允许对新列表中的每种药物进行匹配:

new<-c("supercure firm1 500mg","randomcure firm2 1000mg","unknowncure firm2 100mg")
registered<-c("supercure firm1 1000mg","supercure firm2 500mg","randomcure firm1 1000mg")
res<-unlist(sapply(new,agrep,x=registered))
res

正如预期的那样,supercure 得到两个匹配,randomcure 一个匹配和 unknowncure 没有匹配(这是我想要的)。但是,sapply似乎已经更改了名称,因此没有重复的 :supercure firm1 500mg成为supercure firm1 500mg1supercure firm1 500mg2:

supercure firm1 500mg1   supercure firm1 500mg2 randomcure firm2 1000mg 
                    1                       2                       3 

这是一个问题,因为它阻止我从新列表中选择匹配的药物:

new[new %in% names(res)]仅捕获 randomcure(因为 supercure 的名称已更改)。

我可以想办法通过相当不优雅的文本处理来解决这个问题,但是有没有更聪明的方法来获取找到匹配项的新药列表?

理想的输出是:

supercure firm1 500mg   supercure firm1 500mg randomcure firm2 1000mg 
                    1                       2                       3 
4

2 回答 2

1

您可以尝试使其成为数据框,stack并使用setNames它使其成为命名向量,即

d1 <- unique(stack(data.frame(Filter(length, sapply(new,agrep,x=registered)))))
#  values                     ind
#1      1   supercure.firm1.500mg
#2      2   supercure.firm1.500mg
#3      3 randomcure.firm2.1000mg

setNames(d1$values, d1$ind)
#  supercure.firm1.500mg   supercure.firm1.500mg randomcure.firm2.1000mg 
#                      1                       2                       3 
于 2017-09-04T09:58:34.513 回答
1

sapply没改名字,改unlist了。这给出了所需的输出:

x <- sapply(new,agrep,x=registered)
setNames(unlist(x),rep(names(x),lengths(x)))
#  supercure firm1 500mg   supercure firm1 500mg randomcure firm2 1000mg 
#                      1                       2                       3
于 2017-09-04T12:47:17.230 回答