2016-08-15 4 views
-3
Names <- c("SUSAN,ALTOP","Brent,SPINER","KIM,YAMAGUCHI","John,McMurphy","Kevin,Y") 
City <- c("Toronto","New York","Chicago","Toronto","Tokyo") 
DF <- data.frame(Names,City) 

Я надеюсь создать функцию, которая будет заглавной и фамилию в простом примере кадра данных выше, так что имена читать как «Сьюзан Алтоп», «Брент Спинер» ... и т. д. (Обратите внимание, что я также удалил запятые.)Использования Dplyr и Tidyr в функции для заглавных имен и фамилии в колонке Dataframe

Я могу выполнить это, используя следующие коды, отдельно или с трубопроводом. Но я надеюсь создать функцию, так как мне придется делать это много раз, но я не уверен, как это сделать при использовании dplyr, tidyr и т. Д. Я также открыт для более творческих предложений, которые используют списки и purrr, если это возможно.

DF <- DF %>% separate(DF,Names,c("First","Last",sep=","),remove=TRUE) 
DF <- DF %>% mutate_each(funs(tolower),First,Last) 
DF <- DF %>% mutate_each(funs(Capitalize),First,Last) 
DF <- DF %>% mutate(NewNames=paste0(First," ",Last) 
+0

У меня есть функция, которую я написал сделать это давным-давно, но он не использует никаких специальных пакетов. Ты хочешь это? он работает с именами McName, арабскими именами и т. д. –

+0

Если ваша проблема заключается в написании функции, вы должны четко понимать, что такое ваши входы и выходы. Вы хотите предоставить ему фрейм данных? Вы хотите использовать все столбцы? Должна ли ваша функция угадывать, следует ли разделять запятыми? Будете ли вы гарантировать, что все столбцы являются строками? Есть ли другие аргументы, которые вы хотите дать? – Gregor

+0

Не то, чтобы я действительно рекомендую этот подход, но: 'library (tidyr); библиотека (dplyr); DF%>% отдельно (имена, c ('First', 'Last'))%>% mutate_at (vars (-City), funs (paste0 (substr (., 1, 1), tolower (substr (., 2 , nchar (.))))))%>% unite (имена, первая, последняя, ​​sep = '') 'Практически любая техника собирается убить вторую« М »« МакМерфи ». – alistaire

ответ

4

Существует stri_trans_totitle функция из stringi пакета, который, кажется, делает то, что вы ищете:

library(dplyr); library(stringi) 
DF %>% mutate(Names = stri_trans_totitle(gsub(",", " ", Names))) 

#   Names  City 
# 1 Susan Altop Toronto 
# 2 Brent Spiner New York 
# 3 Kim Yamaguchi Chicago 
# 4 John Mcmurphy Toronto 
# 5  Kevin Y Tokyo 

Или используйте str_to_title из stringr:

library(stringr) 
DF %>% mutate(Names = str_to_title(gsub(",", " ", Names))) 

#   Names  City 
# 1 Susan Altop Toronto 
# 2 Brent Spiner New York 
# 3 Kim Yamaguchi Chicago 
# 4 John Mcmurphy Toronto 
# 5  Kevin Y Tokyo