基本上,我有一个公司列表(标记为列表A),还有一个很大的清单(标记为列表B)。我想查询列表A的元素是否也在列表B中。某些相同的公司存在细微差异,因此我必须使用模糊匹配。幸运的是,我已经成功地找到了A中的元素,而B中没有。但是我不知道如何在不引起混乱的情况下将其删除。 (似乎很容易引起边界错误)
company <- read.table(text = "
CompanyName
'MERCK SHARP & DOHME CORPORATION'
'GILEAD SCIENCES INC'
'BOEHRINGER INGELHEIM PHARMACEUTICALS, INC.'
'ABBVIE, INC.'
'JANSSEN SCIENTIFIC AFFAIRS, LLC'
'ASAHI INTECC CO., LTD.'
", header = TRUE, stringsAsFactors = FALSE)
Report <- c('MERCK ','BOEHRINGER INGELHEIM','ROCHE','ASAHI')
sapply(lapply(Report, function(x) agrepl(x, company$CompanyName, max.distance=0.1)), max)
上面是我的可复制数据和模糊匹配代码,该代码返回
[1] 1 1 0 1
但是我不知道该如何删除该0位上的公司。 在每个元素上运行循环是一个好主意吗? 我希望我的结果是
'MERCK ','BOEHRINGER INGELHEIM','ASAHI'
答案 0 :(得分:0)
我定义了以下函数,该函数返回与z项匹配的项形式Report
myfunc = function(z){Report[which(lapply(Report,function(y){agrepl(y,z,max.distance = 0.1)})%>%unlist)]}
然后依次应用于列表中的每个元素。我使用了unlist
和magrittr包中的管道符号%>%
将列表结构转换为向量。
lapply(company$CompanyName,myfunc) %>% unlist
如果您希望报表为变量,为了将该函数用于不同的报表,可以定义函数
myfunc2 = function(z,report){report[which(lapply(report,function(y){agrepl(y,z,max.distance = 0.1)})%>%unlist)]}
然后调用Report as和lapply的additional参数
lapply(company$CompanyName,myfunc2,Report) %>% unlist