R gsub名字姓氏至FL

R gsub名字姓氏至FL,r,gsub,R,Gsub,我想把一系列的名字改成简单的首字母 假设我有两个名字c(“Ben Franklin”,“Millard Fillmore”),我想将它们子集为c(“BF”,“MF”),我已经阅读了帮助文件eto?gsub,但我无法理解。这里有人能帮我吗?拆分“上的字符串,然后对每个组件应用substr函数,并使用粘贴折叠结果 > x <- c("Ben Franklin", "Millard Fillmore") > sapply(strsplit(x, " "), function(x) p

我想把一系列的名字改成简单的首字母


假设我有两个名字
c(“Ben Franklin”,“Millard Fillmore”)
,我想将它们子集为
c(“BF”,“MF”)
,我已经阅读了帮助文件eto
?gsub
,但我无法理解。这里有人能帮我吗?

拆分
上的字符串,然后对每个组件应用
substr
函数,并使用粘贴折叠结果

> x <- c("Ben Franklin", "Millard Fillmore")
> sapply(strsplit(x, " "), function(x) paste(substr(x, 1, 1), collapse=""))
[1] "BF" "MF"
>x sapply(strsplit(x,”),函数(x)粘贴(substr(x,1,1),collapse=“”))
[1] “BF”“MF”
仅使用gsub

 gsub(pattern='(.)(.*)[[:space:]](.)(.*)','\\1\\3',c("Ben Franklin", "Millard Fillmore"))

 "BF" "MF"

这将删除所有不是大写字母的内容:

> s <- c("Ben Franklin", "Millard Fillmore")
> gsub("[^A-Z]", "", s)
[1] "BF" "MF"
>s gsub(“[^A-Z]”,s)
[1] “BF”“MF”
根据注释,如果您有“Allan McCormick”这样的字符串,那么下面是一个更复杂的正则表达式:

s <- c("Ben Franklin", "Millard Fillmore", "Allen McCormick")
gsub("(.)\\S* *", "\\1", s)
[1] "BF" "MF" "AM"

s您可以将其缩短一点:
gsub(“^(...*”,“\\1\\2”,x)
但是,它仍然假设每个人只有两个名字。如果某人有中间名,则不会使用中间首字母(这可能是可取的)。@GSee你说得对!也许你有一个很长的名字,有这样的反射:)相当优雅。。。如果我们可以假设名字的第一个字母总是大写(似乎合理)。。。虽然类似于“McCormick”的测试失败了,但我比较了速度上的答案,根据我的真实数据,这是迄今为止最快的。此外,这个例子解释了超过两个单词长的名字,甚至还有一个额外的例子,比如McCormick。非常感谢@agstudy,我在
gsub
上瞎混,但我完全不懂,我想不出你和其他人的建议。谢谢