Разделите имена и создайте матрицу в R - PullRequest
0 голосов
/ 16 мая 2018

У меня есть эти данные:

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 голосов
/ 16 мая 2018

Другое регулярное выражение решение:

gsub("(\\w+), (\\w+)", "\\2 \\1", names)
# [1] "Chet Baker"   "Keith Jarret" "Miles Davis" 
0 голосов
/ 16 мая 2018

Вы можете легко адаптировать шаблон, используемый в регулярном выражении, так, чтобы он совпадал либо с запятой, за которой следуют 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" 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...