部分匹配字符串并在多个向量上完全替换

时间:2019-05-17 05:36:39

标签: r list replace dplyr

想通过提供将被搜索(和匹配)并用作替换的字符串向量来有效地替换单个列上的所有部分匹配字符串。也就是说,对于下面 df 中的每个矢量,它将与 vec_string 中的矢量部分匹配。找到匹配项后,它将简单地用 vec_string 替换整个字符串。即将“订户经理”转换为“经理”。通过在 vec_string 中提供更多矢量,它将搜索整个df,直到完成所有操作。

我已经启动了该函数,但是似乎无法通过用vec_string替换df中的向量来完成它。感谢您的帮助

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 个答案:

答案 0 :(得分:1)

这应该可以解决问题

Future

我们将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部分,否则保留原样。请注意,如果有超过1个匹配项,它将保留第一个匹配项。