6

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

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

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

4

3 回答 3

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"    
于 2013-01-23T17:16:29.040 回答
4

(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"

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

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

更新:添加了代码以将每个名字和姓氏分开到一个单独的元素中,以防这是首选的输出格式。

于 2013-01-23T18:07:06.380 回答
1

我赞成@AnandaMahto 的回答,但只是为了好玩,这说明了另一种使用scansplit和的方法rapply

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=' '))
于 2013-01-23T17:21:51.483 回答