【问题标题】:gsub First-name Last-name to FLgsub 名字 姓氏到 FL
【发布时间】:2012-11-22 13:02:05
【问题描述】:

我想将一系列名称更改为它们的首字母,

假设我有两个名字c("Ben Franklin", "Millard Fillmore"),我想将它们子集到c("BF", "MF"),我已经阅读了?gsub 的帮助文件,但我无法弄清楚。这里有人可以帮帮我吗?

【问题讨论】:

  • @agstudy,我和gsub 混在一起了,但我不理解它,我可以想出你和其他人的建议。谢谢!

标签: r gsub


【解决方案1】:

这会删除所有非大写字母:

> s <- c("Ben Franklin", "Millard Fillmore")
> gsub("[^A-Z]", "", s)
[1] "BF" "MF"

如果您根据 cmets 有诸如“Allan McCormick”之类的字符串,这里是一个更复杂的正则表达式:

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

【讨论】:

  • 相当优雅!! ...如果我们可以假设名称的第一个字母总是大写(似乎合理)...虽然它失败了像“McCormick”这样的东西
  • 我比较了速度上的答案,这是迄今为止最快的,在我的真实数据上。此外,这个例子解释了超过两个单词的名字,甚至还有一个额外的例子来描述像 McCormick 这样的名字。非常感谢!
【解决方案2】:

只用 gsub

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

 "BF" "MF"

【讨论】:

  • 你可以把它缩短一点:gsub("^(.).* (.).*", "\\1\\2", x) 但是,它仍然假设每个人只有 2 个名字。如果某人有中间名,则不会使用中间名首字母(这可能是可取的)。
  • @GSee 你是对的!也许你有一个长的名字有这样的反射:)
【解决方案3】:

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

> x <- c("Ben Franklin", "Millard Fillmore")
> sapply(strsplit(x, " "), function(x) paste(substr(x, 1, 1), collapse=""))
[1] "BF" "MF"

【讨论】:

    猜你喜欢
    • 2016-02-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-03
    • 1970-01-01
    • 2013-01-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多