2016-08-15 86 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) 

我希望创建一个将在简单的例子,数据帧大写第一个和最后一个名称的上方,使得一个函数的名称读作“Susan Altop”,“Brent Spiner”等。 (请注意,我也删除了逗号。)在函数中使用Dplyr和Tidyr大写姓和名的数据帧列

我可以使用以下代码单独或使用管道完成此操作。但我希望创建一个函数,因为我必须多次执行此操作,但在使用dplyr,tidyr等时,我不确定如何执行此操作。我也接受更多有创意的使用列表的建议如果可能的话,还有咕噜声。

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

不是我真的推荐这种方法,而是:'库(tidyr);图书馆(dplyr); DF%>%separate(Names,c('First','Last'))%> mutate_at(vars(-City),funs(paste0(substr(。,1,1),tolower(substr(。,2 ,nchar(。))))))%>%unite(Names,First,Last,sep ='')尽管如此,几乎任何技术都会杀死“McMurphy”的第二个“M”。 – alistaire

回答

4

有一个从stringistri_trans_totitle功能,这似乎是你在找什么:

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_titlestringr

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 
相关问题