首页 > 解决方案 > 拆分名称并在 R 中创建矩阵

问题描述

我有这个数据:

names <- c("Baker, Chet", "Jarret, Keith", "Miles Davis")

我想操纵它,所以名字排在第一位,所以我把它分开了:

names <- strsplit(names, ", ")

[[1]]
[1] "Baker" "Chet"

[[2]]
[1] "Jarret" "Keith"

[[3]]
[1] "Miles Davis"

问题是,当我想把它们放在一起时,名字"Miles Davis"会出错,因为它已经是full name.

matrix(unlist(names), ncol=2, byrow = TRUE)

     [,1]          [,2]    
[1,] "Baker"       "Chet" 
[2,] "Jarret"      "Keith"
[3,] "Miles Davis" "Baker"

我应该怎么做才能创建一个df看起来像这样的新产品:

"Chet Baker"
"Keith Jarret"
"Miles Davis"

这是参考:http ://rfunction.com/archives/1499

标签: r

解决方案


您可以轻松地调整正则表达式中使用的模式,使其匹配逗号后跟 0+ 个空格或 1+ 个空格:

names <- strsplit(names, ",\\s*|\\s+")
matrix(unlist(names), ncol=2, byrow = TRUE)
#     [,1]     [,2]   
#[1,] "Baker"  "Chet" 
#[2,] "Jarret" "Keith"
#[3,] "Miles"  "Davis"

由于期望的结果与最初描述的不同,这里有一种不同的方法:

names <- strsplit(names, ",\\s*")
data.frame(name = sapply(names, function(x) paste(rev(x), collapse = " ")))
#          name
#1   Chet Baker
#2 Keith Jarret
#3  Miles Davis

另一种选择,在正则表达式中使用捕获组将逗号之前的所有内容与逗号之后的所有内容交换,并将逗号替换为空格。

names <- c("Baker, Chet", "Jarret, Keith", "Miles Davis")
sub("([^,]+),\\s*([^,]+)$", "\\2 \\1", names)
#[1] "Chet Baker"   "Keith Jarret" "Miles Davis" 

推荐阅读