【问题标题】:Return True or False if values in a column contain elements from a list of strings R如果列中的值包含字符串列表中的元素,则返回 True 或 False R
【发布时间】:2021-11-27 18:48:07
【问题描述】:

我想检查列值和字符串列表之间是否存在紧密匹配。很少有完美的匹配,所以 %in% 不好。我宁愿谨慎行事也不愿错过任何事情,但是我宁愿避免匹配每个单词中的潜在模式

例如

列表:

Tenis PLC
Green Company Limited
(DCC) Darth Company Creditors

数据框

ID.  Company Name
10.  Ten LTD
12.  Green Company (GC) LTD
23   MCC
48.  DARTH

返回

False
True
False
True

编辑:我应该提到我现在已经清理了一些数据,使其全部小写并删除所有括号

【问题讨论】:

  • 您是否正在寻找任何单词之间的匹配项?根据最后一个词“DARTH”,您可能需要距离方法,但这也不准确
  • 是的,所以我想检查列表中是否包含任何公司名称,或者它们是否紧密匹配。我不确定距离方法是什么

标签: r list dataframe


【解决方案1】:

要重新生成数据:

l = list(tolower(c('Tenis PLC',
     'Green Company Limited',
     '(DCC) Darth Company Creditors')))

tmp_df = data.frame(Company_Name=c(tolower(c('Ten LTD', 'Green Company (GC) LTD', 'MCC',
        'DARTH'))))

解决办法:

  1. 获取所有子串除以空格:
    split1 = unlist(strsplit(unlist(l), ' '))
  1. 查找Company_name 中的任何值是否包含它们(假设这就是您的意思):
    sapply(tmp_df$Company_Name,
           function(x) {sum(unlist(strsplit(x, ' ')) %in% split1) >= 1})

编辑:

要在 split1 中保留至少 3 个字符的项目:

    split1[sapply(split1, nchar) > 3]

【讨论】:

  • 效果很好。现在,如果我能找到一种方法从 unlist1 中删除长度为 3 个或更少字符的项目,这将删除很多不必要的元素
  • 也许可以编辑您的问题,我将添加以下答案并进行编辑。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-04-20
  • 1970-01-01
相关资源
最近更新 更多