如果该元素不在另一个列表中,则如何删除该元素

时间:2019-10-23 06:56:09

标签: r list

基本上,我有一个公司列表(标记为列表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'

1 个答案:

答案 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