#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'))))
Решение:
- Разделите всю подстроку пробелом:
split1 = unlist(strsplit(unlist(l), ' '))
- Найдите, содержит ли их какое-либо из значений в
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. Возможно, отредактируйте свой вопрос, я добавлю следующий ответ с правкой.