R: очистка строки с использованием списка требуемых подстрок

#r #string #data-cleaning

#r #строка #очистка данных

Вопрос:

У меня есть фрейм данных со строкой

 Clause <- c('Big Truck Pb Anomaly Low', 'Red Truck Fe Anomaly High', 'Blue Truck Pb Anomaly High amp; Old Truck Fe Anomaly Low')
Input <- data.frame(Clause)
  

Я хотел бы очистить эту строку, сохранив только подстроки, найденные в списке очистки;

 Keepers <- c('Anomaly', 'Low', 'High', 'amp;', 'Pb', 'Fe', ' ', 'SomethingNotPresent')
  

Желаемый результат приведен ниже.

 Wanted <- c('Pb Anomaly Low', 'Fe Anomaly High', 'Pb Anomaly High amp; Fe Anomaly Low')
Result <- data.frame(Wanted)
  

Примечание: список ‘Хранителей’ также будет содержать такие элементы, как ‘SomethingNotPresent’

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

1. Небольшое исправление внесено во входной фрейм данных

Ответ №1:

Вы можете разделить строку на каждое слово и сохранить только Keepers слова для каждой строки.

 sapply(strsplit(Input$Clause, '\s '), function(x) 
       paste0(x[x %in% Keepers], collapse = ' '))

#[1] "Pb Anomaly Low"     "Fe Anomaly High"     "Anomaly High amp; Fe Anomaly Low"
  

Ответ №2:

Вы можете сформировать регулярное выражение чередования терминов из белого списка для сохранения. Затем используйте шаблон отрицательного просмотра, чтобы определить все термины / пробелы, которые следует удалить:

 alternation <- paste(Keepers, collapse="|")
regex <- paste0("\s*(?!(?:", alternation, "))(?<!\S)\S (?!\S)\s*")
df$clause <- gsub("\s ", " ", trimws(gsub(regex, " ", df$clause, perl=TRUE)))
df

                            clause
1                   Pb Anomaly Low
2                  Fe Anomaly High
3 Pb Anomaly High amp; Fe Anomaly Low
  

Данные:

 inp <- c('Big Truck Pb Anomaly Low', 'Red Truck Fe Anomaly High',
         'Blue Truck Pb Anomaly High amp; Old Truck Fe Anomaly Low')
df <- data.frame(clause=inp, stringsAsFactors=FALSE)
Keepers <- c('Anomaly', 'Low', 'High', 'amp;', 'Pb', 'Fe', ' ', 'SomethingNotPresent')