Упростить строки относительно подстроки - PullRequest
1 голос
/ 08 мая 2020

У меня есть база данных с несколькими повторяющимися записями, которые сообщают (непоследовательно) дополнительную информацию. Я хотел бы избавиться от информации и сохранить самую простую версию для каждой записи.

db <- data.frame(company=c("ENTRY_X","ENTRY_X COUNTY_1","COUNTY_2 ENTRY_X","ENTRY_Y"))
db_desiderata <- data.frame(company=c(rep("ENTRY_X",3),"ENTRY_Y"))

Записи, возможно, представляют собой длинные строки (некоторые с пробелами). Вот несколько примеров: «General Motors Company» и «General Motors». Мне удается изолировать все записи, которые необходимо заменить их подстрокой (включая db $). Я планирую запустить его рекурсивно.

Попытка кода (все работает, я не могу понять, что делать дальше):

db$included <- lapply(db$company, function(x) c(grep(x,db$company,value=T)))
db$lenght <- lapply(db$included, function(x) length(unlist(x)))
db$included <- ifelse(db$lenght==1,NA,db$included)

Ответы [ 2 ]

1 голос
/ 09 мая 2020

Следующее должно работать, если данные строго соответствуют этим шаблонам:

  1. Желаемое имя должно быть первым в последовательности альтернативных имен
  2. Желаемое имя должно быть является самым коротким в последовательности альтернативных названий и не может сопровождаться названием компании, которое является более коротким подмножеством предыдущего названия компании.

Я буду использовать вариант данных Чака П., чтобы проиллюстрировать, как это работает и проблемы, если шаблоны не соблюдаются.

db <- data.frame(company = c("General Foods","More General Foods","General Foods Cereal Division","General Auto",
                         "General Motors Company", "General Motors", "European General Motors Company", 
                          "General", "Asia General Toys") )

companies <- Reduce( f = function(y,x) {if(grepl(pattern = y, x=x)) y else x},
                 x=db$company, accumulate = TRUE)

, что дает

companies
[1] General Foods          General Foods          General Foods          General Auto           General Motors Company
[6] General Motors         General Motors         General                General  
0 голосов
/ 08 мая 2020

Думаю, я немного лучше понимаю вашу ситуацию после вашего комментария, но я все равно очень опасаюсь полностью автоматизированного решения, одного промаха или одного термина, который был слишком ), а вы облажались ...

Я взял ваши ранние работы и немного переименовал. Думайте о своем оригинальном length как о мере потенциала. Я смотрел на потенциальную колонку человеческим глазом и выбирал места для замены. Я бы подошел к этому с помощью stringr::str_replace_all. Если вы используете именованный вектор, как я показал ниже, вы сможете обрабатывать широкий спектр случаев с помощью вырезания и вставки. "^.*General Motors.*$" просто означает, если вы найдете его где-нибудь в строке, спереди или сзади. Вы можете работать итеративно и просто продолжать добавлять в названный вектор, пока он не будет очищен. 3,0)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...