(简洁/有效)在消除(多个)名字中的首字母时忽略单个字符



我正试图从~ 1000万个名称中剥离首字母,但我正在寻找一种高效/简洁的方法来构建由单个字符组成的名称的异常。

例如:

dt<-data.table(fnm=c("audrey e","joe buck","m","w c"),
               lnm=c("claire","b","nop","fields"))

如果我只是做:

nm<-c("fnm","lnm")
dt[,paste0("str_",nm):=lapply(.SD,function(x)gsub("\s|\b[a-z]\b","",x)),
   .SDcols=nm]; rm(nm)

"m", "b""w c"被删除了,这给我带来了麻烦:

        fnm    lnm str_fnm str_lnm
1: audrey e claire  audrey  claire
2: joe buck      b joebuck        
3:        m    nop             nop
4:      w c fields          fields

一个冗长的替代方法是将必要的代码行展开:

dt[gsub("\s","",str_fnm)=="",str_fnm:=fnm]
dt[gsub("\s","",str_lnm)=="",str_lnm:=lnm]

除了冗长之外,这似乎有些低效,因为我仍然需要进行向量比较。

基本上,我需要的是一种将单字符异常构建到正则表达式本身的方法;有没有我没有想到的方法?

也许我遗漏了一些细节,但为什么不简单:

sub("( [a-z])+$|^([a-z] )+", "", x)

似乎问题更复杂,可能不值得尝试使用正则表达式来解决。所以在之后修复它:

for (x in nm) dt[get(paste0('str_', x)) == "", paste0('str_', x) := get(x)]

最新更新