Форматирование строк символов (имя и фамилия) в длинном векторе символов в R

У меня много имен людей в моем векторе символов:

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"

Я предполагаю, что лучший способ атаковать это - использовать grep или sub, но я не могу понять это. Я все еще новичок в использовании R, но мне нравятся все его возможности!

Любая помощь будет принята с благодарностью! Благодарю вас!


person IRNotSmart    schedule 17.04.2016    source источник


Ответы (2)


Мы можем использовать 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+), зацикливаем list с vapply и paste строками вместе.

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)
person akrun    schedule 17.04.2016

Мы можем использовать strsplit и paste:

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) добавляет фамилию.

person Vincent Bonhomme    schedule 17.04.2016