2013-01-23 30 views
6

मैं तार कि अंतिम नाम में नामों की सूचियाँ शामिल हैं का एक समूह है, प्रथम नाम प्रारूप, इसलिए जैसे अल्पविराम के द्वारा अलग में:"अंतिम नाम, प्रथम नाम" -> "पहला नाम अंतिम नाम" धारावाहिक तार

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

सबसे आसान तरीका है प्रथम नाम अंतिम नाम प्रारूप करने के लिए तार के भीतर इन सभी के नाम परिवर्तित करने के लिए क्या है?

+0

यह हमेशा अधिक बस से दो नामों के साथ नाम के जोड़े के होने जा रहा है, या लोगों को वहाँ हो जाएगा? – A5C1D2H2I1M1N2O1R2T1

+0

आपका मतलब है "हूवर, जे एडगर" जैसे कुछ? हो सकता है। यह वास्तव में दुर्भाग्यपूर्ण है कि वही विभाजक का उपयोग पहले नाम और अन्य नामों के नाम से अलग करने के लिए किया गया है। लेकिन यह वही तरीका है, मुझे डर है। क्या सच है (मुझे उम्मीद है ...) यह है कि अल्पविराम पहले या अंतिम नाम में प्रकट नहीं होता है। – RoyalTS

+0

मुझे लगता है कि उनके उदाहरण में कुछ उद्धरण गायब थे। यदि एकल तत्व में 1 से अधिक नाम होते हैं तो शायद सरल रेगेक्स करने से पहले ऐसा करने के लिए बहुत सारे काम (विभाजन और अद्वितीय नाम बनाने के लिए पुन: संयोजन) होगा। –

उत्तर

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"   

मैं अच्छा उपाय के लिए वहाँ में जे एडगर हूवर जोड़ दिया है।

आप ऐसे नाम हैं जो एक साथ उद्धृत किया गया, एक साथ रहने के लिए अपने paste() कार्य करने के लिए collapse = ", " जोड़ने चाहते हैं:

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"  
+0

लवली, धन्यवाद!तारों को अंत में फिर से एक साथ रखने का कोई तरीका? – RoyalTS

+0

@ रॉयलट्स ने एक अपडेट जोड़ा। – A5C1D2H2I1M1N2O1R2T1

+0

बिल्कुल सही! बहुत बहुत धन्यवाद। – RoyalTS

1

मैं @ AnandaMahto के उत्तर के पक्ष में हूँ, लेकिन सिर्फ मनोरंजन के लिए, यह एक और तरीका दिखाता है scan, split, और 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=' ')) 
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) एक में अलग तत्व प्रति नाम तो आपको एक अलग तत्व में प्रत्येक प्रथम नाम अंतिम नाम चाहता था तो का उपयोग (क) स्कैन

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

जहां out ऊपर gsub का परिणाम है या उसे सीधे कोशिश (ख) प्राप्त करने के लिए 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" 

ध्यान दें कि मिलान के लिए प्रयोग किया जाता है उसी रेगुलर एक्सप्रेशन उपरोक्त सभी उदाहरण हैं।

अद्यतन: हटाया अल्पविराम प्रथम और अंतिम नाम को अलग।

अद्यतन: जोड़ा कोड बाहर प्रत्येक पहला नाम मामले में एक अलग तत्व वरीय उत्पादन प्रारूप है कि में अंतिम नाम के अलग करने के लिए।

+0

बहुत अच्छी व्याख्या के लिए धन्यवाद। अगर मैं कर सकता तो मैं इसे और अधिक कर दूंगा! – RoyalTS

+0

यह बहुत अच्छा है। यह मेरे लिए नहीं हुआ कि रेगेक्स इस तरह से काम करेगा, इसलिए मैंने कोशिश करने के लिए परेशान नहीं किया! – A5C1D2H2I1M1N2O1R2T1

 संबंधित मुद्दे

  • कोई संबंधित समस्या नहीं^_^