Возвращает значение True или False, если значения в столбце содержат элементы из списка строк R

#r #list #dataframe

Вопрос:

Я хочу проверить, есть ли близкое совпадение между значениями столбцов и списком строк. Редко бывает идеальное совпадение, так что %в% не годится. Я бы предпочел ошибиться в сторону осторожности, чем что-то пропустить, однако я бы предпочел избегать сопоставления потенциальных шаблонов в каждом отдельном слове

Например

Список:

 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
 

ПРАВКА: Я должен упомянуть, что теперь я немного очистил данные, чтобы сделать их строчными и удалить все скобки

Комментарии:

1. Вы ищете соответствие между каким-либо словом? Основываясь на последнем слове «ДАРТ», кажется, что вам может понадобиться метод расстояния, но это также не будет точным

2. Да, поэтому я хочу проверить, содержатся ли какие-либо названия компаний в списке или они близко совпадают. Я не уверен, что такое метод расстояния

Ответ №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]
 

Комментарии:

1. Это хорошо работает. Теперь, если бы я мог найти способ удалить элементы из списка 1, длина которых составляет 3 или менее символов, это удалило бы много ненужных элементов

2. Возможно, отредактируйте свой вопрос, я добавлю следующий ответ с правкой.