(1) Mantenere stessi nomi in ciascun elemento Questo può essere fatto con un singolo gsub
(assumendo non ci sono virgole all'interno dei nomi):
> 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) separati in un unico nome per elemento Se si desidera il cognome di ciascun nome in un elemento separato, utilizzare (a) scansione
scan(text = out, sep = ",", what = "")
dove out
è il risultato della gsub
sopra o per farlo provare direttamente (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"
noti che tutti gli esempi sopra usato la stessa espressione regolare per la corrispondenza.
AGGIORNAMENTO: rimossa la virgola che separa il nome e il cognome.
AGGIORNAMENTO: codice aggiunto per separare il cognome di ciascun nome in un elemento separato nel caso in cui si tratti del formato di output preferito.
Ci saranno sempre coppie di nomi o ci saranno persone con più di due soli nomi? – A5C1D2H2I1M1N2O1R2T1
Intendi qualcosa come "Hoover, J. Edgar"? Potrebbe essere. È davvero spiacevole che lo stesso separatore sia stato utilizzato per separare l'ultimo dal nome e dai nomi degli altri sami. Ma è così, ho paura. Ciò che è vero (spero ...) è che le virgole non compaiono all'interno di un nome o di un cognome. – RoyalTS
Penso che il suo esempio avesse alcune citazioni mancanti. Se un singolo elemento contiene più di un nome allora probabilmente ci sarebbe molto lavoro (spaccare e ricombinare per formare un nome univoco e così via) prima di poter fare una semplice regex. –