Частичная строка соответствия и полная замена по нескольким векторам - PullRequest
0 голосов
/ 17 мая 2019

Хотелось бы эффективно заменить все строки частичного совпадения в одном столбце, указав вектор строк, которые будут искать (и сопоставляться), а также использоваться в качестве замены. т.е. для каждого вектора в df ниже, он будет частично совпадать для векторов в vec_string . Если совпадения найдены, он просто заменит всю строку на vec_string . то есть превращение «менеджер подписчика» в «менеджер». Предоставляя больше векторов в vec_string , он будет выполнять поиск по всей df, пока все не будет завершено.

Я запустил функцию, но не могу завершить ее, заменив векторы в df на vec_string. Ценю вашу помощь

df <- c(
'solicitor'
,'subscriber manager'
,'licensed conveyancer'
,'paralegal'
,'property assistant'
,'secretary'
,'conveyancing paralegal'
,'licensee'
,'conveyancer'
,'principal'
,'assistant'
,'senior conveyancer'
,'law clerk'
,'lawyer'
,'legal practice director'
,'legal secretary'
,'personal assistant'
,'legal assistant'
,'conveyancing clerk')

vec_string <- c('manager','law')

#function to search and replace
replace_func <-
  function(vec,str_vec) {
    repl_str <- list()
    for(i in 1:length(str_vec)) {
      repl_str[[i]] <- grep(str_vec[i],unique(tolower(vec)))
    }
    names(repl_str) <- vec_string
    return(repl_str)
  }

replace_func(df,vec_string)

$`manager`
[1] 2

$law
[1] 13 14

Как видите, функция возвращает именованный список с элементами, на замену которых будет

1 Ответ

1 голос
/ 17 мая 2019

Это должно сработать

res = sapply(df,function(x){
  match = which(sapply(vec_string,function(y) grepl(y,x)))
  if (length(match)){x=vec_string[match[1]]}else{x}
})
res

 [1] "solicitor"               "manager"                 "licensed conveyancer"   
 [4] "paralegal"               "property assistant"      "secretary"              
 [7] "conveyancing paralegal"  "licensee"                "conveyancer"            
[10] "principal"               "assistant"               "senior conveyancer"     
[13] "law"                     "law"                     "legal practice director"
[16] "legal secretary"         "personal assistant"      "legal assistant"        
[19] "conveyancing clerk" 

Мы сравниваем каждую часть df с каждой частью vec_string. Если есть совпадение, возвращается часть vec_string, иначе она остается как есть. Следите за тем, как если бы было более 1 матча, он сохранит первый.

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