在R语言中提取字符串首字母(排除最后一个单词)的最优方法
嘿,这个字符串处理需求挺实用的!我来给你分享几个在R里实现的靠谱方法,针对你的数据框场景,直接就能套用:
方法1:用
stringr包(简洁易读,首推) stringr是tidyverse家族里专门搞字符串的工具包,语法特别直观,新手也能快速上手:
首先得加载包:
library(stringr)
然后直接处理你的NAMES数据框:
NAMES$result <- str_replace_all(NAMES$ID, "^((\\w+)\\s+)+(\\w+)$", function(x) { # 把字符串按空格拆成单词列表 words <- str_split(x, "\\s+")[[1]] # 提取除最后一个单词外的所有首字母,拼接成串 initials <- str_sub(words[-length(words)], 1, 1) %>% str_c(collapse = "") # 把首字母和最后一个单词用空格连起来 str_c(initials, words[length(words)], sep = " ") })
运行完之后,NAMES$result就是你要的结果:"GS BROGAN", "AS WILLIS", "UIS STATION"
方法2:基础R原生实现(不用装额外包)
要是你不想加载第三方包,用基础R的函数也能搞定,逻辑和上面一致:
NAMES$result <- sapply(NAMES$ID, function(x) { words <- strsplit(x, "\\s+")[[1]] # 兼容一下只有单个单词的情况(虽然你的数据里没有,但多做一步总是稳的) if (length(words) == 1) { return(x) } # 提取首字母并拼接 initials <- paste(substr(words[-length(words)], 1, 1), collapse = "") # 拼接首字母和最后一个单词 paste(initials, words[length(words)], sep = " ") })
方法3:正则表达式一步到位(高效简洁)
如果追求极致简洁,用正则表达式可以一行搞定,不过得稍微理解下正则逻辑:
NAMES$result <- str_replace(NAMES$ID, "\\b(\\w)\\w*\\s+(?=.*\\s)", "\\1")
这个正则的意思是:匹配每个不是最后一个的单词,只保留它的首字母,把单词剩下的部分和空格替换掉,最后就自动得到首字母拼接+最后一个单词的结果啦。
这几种方法都能完美输出你想要的结果,其中方法1最容易维护,适合日常使用;方法3最精简,适合喜欢正则的小伙伴;方法2则是无依赖的原生方案。
内容的提问来源于stack exchange,提问作者Curious
相关产品推荐
相关产品推荐

