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) 各要素で同じ名前を維持するこれは、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) 要素ごとに 1 つの名前に分割します。各名の姓を個別の要素に含める場合は、(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の回答に賛成ですが、楽しみのために、これは、、、およびを使用する別の方法を示し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=' '))
于 2013-01-23T17:21:51.483 に答える