拆分名称并在R中创建矩阵

时间:2018-05-16 12:28:26

标签: 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

2 个答案:

答案 0 :(得分:7)

您可以轻松调整正则表达式中使用的模式,使其匹配逗号后跟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" 

答案 1 :(得分:3)

另一个正则表达式解决方案:

gsub("(\\w+), (\\w+)", "\\2 \\1", names)
# [1] "Chet Baker"   "Keith Jarret" "Miles Davis" 
相关问题