我正试图从~ 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)]