【问题标题】:Formatting Character strings (First and Last Names) in a long character vector in R在R中的长字符向量中格式化字符串(名字和姓氏)
【发布时间】:2016-04-17 07:31:39
【问题描述】:

我的字符向量中有很多人的名字:

MLB$Names[1:4] [1] "Derek Jeter" "Robinson Cano" "Nick Markakis" "David Ortiz"

我想将它们格式化为包含第一个首字母,一个句点,然后是一个空格和他们的姓氏。我希望它看起来像下面的

MLB$NamesFormatted[1:4] [1] "D. Jeter" "R. Cano" "N. Markakis" "D. Ortiz"

我假设最好的攻击方法是使用grepsub,但我终生无法弄清楚。我仍然是使用 R 的新手,但我喜欢它的所有功能!

任何帮助将不胜感激!谢谢!

【问题讨论】:

    标签: r regex gsub names


    【解决方案1】:

    我们可以使用sub,将第一个字符捕获为一个组 (^(.)),然后是一个或多个非空格 (\\S+),然后是另一个由一个或多个空格组成的捕获组,后跟一个或多个字符 ((\\s+.*)) 到字符串的末尾 ($),并替换为第一个反向引用 (\\1),后跟一个 .,然后是第二个反向引用 (\\2)。

    sub("^(.)\\S+(\\s+.*)$", "\\1.\\2", MLB$Names)
    #[1] "D. Jeter"    "R. Cano"     "N. Markakis" "D. Ortiz"  
    

    或者可以使用匹配一个或多个小写字母 ([a-z]+) 的紧凑代码来完成,并将其替换为 .

    sub("[a-z]+", ".", MLB$Names)
    #[1] "D. Jeter"    "R. Cano"     "N. Markakis" "D. Ortiz"  
    

    这里是strsplit 的另一种选择,我们用一个或多个小写字母后跟一个或多个空格 ([a-z]+\\s+) 分隔,将 listvapplypaste 字符串一起循环.

    vapply(strsplit(MLB$Names, "[a-z]+\\s+"), paste, collapse=". ", character(1))
    #[1] "D. Jeter"    "R. Cano"     "N. Markakis" "D. Ortiz"   
    

    数据

    MLB <- data.frame(Names = c("Derek Jeter", "Robinson Cano", 
                  "Nick Markakis", "David Ortiz"), stringsAsFactors=FALSE)
    

    【讨论】:

      【解决方案2】:

      我们可以使用strsplitpaste

      x <- c("Derek Jeter",   "Robinson Cano",     "Nick Markakis",     "David Ortiz")
      
      sapply(strsplit(x, " "), function(x) paste0(substr(x[1], 1, 1), ". ", x[2]))
      
      [1] "D. Jeter"    "R. Cano"     "N. Markakis" "D. Ortiz" 
      

      我们首先拆分姓名和姓氏,得到一个列表;我们sapply 它带有一个匿名函数:i) 采用姓氏的首字母,ii) 添加一个点和一个空格,iii) 添加姓氏。

      【讨论】:

        猜你喜欢
        • 2016-08-09
        • 2013-01-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-10-01
        • 1970-01-01
        相关资源
        最近更新 更多