“姓氏,名字” - >序列化字符串中的“名字姓氏”

时间:2013-01-23 16:54:20

标签: regex string r

我有一堆字符串,其中包含姓氏,名字格式的名称列表,以逗号分隔,如下所示:

names <- c('Beaufoy, Simon, Boyle, Danny','Nolan, Christopher','Blumberg, Stuart, Cholodenko, Lisa','Seidler, David','Sorkin, Aaron')

将字符串中的所有这些名称转换为名字姓氏格式的最简单方法是什么?

3 个答案:

答案 0 :(得分:9)

如果你可以确定一个逗号不是一个人的名字,这可能会有效:

mynames <- c('Beaufoy, Simon, Boyle, Danny',
             'Nolan, Christopher',
             'Blumberg, Stuart, Cholodenko, Lisa',
             'Seidler, David',
             'Sorkin, Aaron',
             'Hoover, J. Edgar')
mynames2 <- strsplit(mynames, ", ")

unlist(lapply(mynames2, 
              function(x) paste(x[1:length(x) %% 2 == 0], 
                                x[1:length(x) %% 2 != 0])))
# [1] "Simon Beaufoy"     "Danny Boyle"       "Christopher Nolan"
# [4] "Stuart Blumberg"   "Lisa Cholodenko"   "David Seidler"    
# [7] "Aaron Sorkin"      "J. Edgar Hoover"        

我已经在那里添加了J. Edgar Hoover。

如果您希望将引用的名称保持在一起,请将collapse = ", "添加到paste()功能中:

unlist(lapply(mynames2, 
              function(x) paste(x[1:length(x) %% 2 == 0], 
                                x[1:length(x) %% 2 != 0],
                                collapse = ", ")))
# [1] "Simon Beaufoy, Danny Boyle"       "Christopher Nolan"               
# [3] "Stuart Blumberg, Lisa Cholodenko" "David Seidler"                   
# [5] "Aaron Sorkin"                     "J. Edgar Hoover"    

答案 1 :(得分:3)

(1)在每个元素中保持相同的名称这可以使用单个gsub来完成(假设名称中没有逗号):

> gsub("([^, ][^,]*), ([^,]+)", "\\2 \\1", names)
[1] "Simon Beaufoy, Danny Boyle"       "Christopher Nolan"               
[3] "Stuart Blumberg, Lisa Cholodenko" "David Seidler"                   
[5] "Aaron Sorkin"    

> gsub("([^, ][^,]*), ([^,]+)", "\\2 \\1", "Hoover, J. Edgar")
[1] "J. Edgar Hoover"

(2)每个元素分成一个名称如果您想在单独的元素中使用每个名字的姓氏,请使用(a)扫描

scan(text = out, sep = ",", what = "")

其中out是上面gsub的结果,或直接尝试(b)strapply

> library(gsubfn)
> strapply(names, "([^, ][^,]*), ([^,]+)", x + y ~ paste(y, x), simplify = c)
[1] "Simon Beaufoy"     "Danny Boyle"       "Christopher Nolan"
[4] "Stuart Blumberg"   "Lisa Cholodenko"   "David Seidler"    
[7] "Aaron Sorkin"     

> strapply("Hoover, Edgar J.", "([^, ][^,]*), ([^,]+)", x + y ~ paste(y, x), 
+   simplify = c)
[1] "Edgar J. Hoover"

请注意,上面的所有示例都使用相同的正则表达式进行匹配。

更新:删除了分隔名字和姓氏的逗号。

更新:添加代码以将每个名字姓氏分隔成单独的元素,以防首选输出格式。

答案 2 :(得分:1)

我赞成@ AnandaMahto的答案,但为了好玩,这说明了另一种使用scansplitrapply的方法。

names <- c(names, 'Chambers, John, Ihaka, Ross, Gentleman, Robert')

# extract names
snames <- 
lapply(names, function(x) scan(text=x, what='', sep=',', strip.white=TRUE, quiet=TRUE))

# break up names
snames<-lapply(snames, function(x) split(x, rep(seq(length(x) %/% 2), each=2)))

# collapse together, reversed
rapply(snames, function(x) paste(x[2:1], collapse=' '))
相关问题