2016-02-05 5 views
7

आर में यह स्ट्रिंग्सप्लिट() कैसे करें? जब डैश द्वारा अलग किए गए पहले नाम नहीं रहते हैं तो विभाजन करना बंद करें। परिणाम में दिए गए दाएं हाथ की तरफ रखें।आर स्प्लिट स्ट्रिंग और सबस्ट्रिंग्स मैच के राउंडथैंड रखें?

a <- c("tim/tom meyer XY900 123kncjd", "sepp/max/peter moser VK123 456xyz") 

# result: 
c("tim meyer XY900 123kncjd", "tom meyer XY900 123kncjd", "sepp moser VK123 456xyz", "max moser VK123 456xyz", "peter moser VK123 456xyz") 

उत्तर

5

यहां विभिन्न आधार स्ट्रिंग कार्यों के कुछ का उपयोग कर एक संभावना है।

## get the lengths of the output for each first name 
len <- lengths(gregexpr("/", sub(" .*", "", a), fixed = TRUE)) + 1L 
## extract all the first names 
## using the fact that they all end at the first space character 
fn <- scan(text = a, sep = "/", what = "", comment.char = " ") 
## paste them together 
paste0(fn, rep(regmatches(a, regexpr(" .*", a)), len)) 
# [1] "tim meyer XY900 123kncjd" "tom meyer XY900 123kncjd" 
# [3] "sepp moser VK123 456xyz" "max moser VK123 456xyz" 
# [5] "peter moser VK123 456xyz" 

अलावा: यहाँ एक दूसरे संभावना, थोड़ा कम कोड का उपयोग कर रहा है। थोड़ा तेज भी हो सकता है।

s <- strsplit(a, "\\/|(.*)") 
paste0(unlist(s), rep(regmatches(a, regexpr(" .*", a)), lengths(s))) 
# [1] "tim meyer XY900 123kncjd" "tom meyer XY900 123kncjd" 
# [3] "sepp moser VK123 456xyz" "max moser VK123 456xyz" 
# [5] "peter moser VK123 456xyz" 
+1

बिल्कुल सही! ..no लूप और बेस फ़ंक्शन बिल्कुल ठीक है जो मैं बाद में था;) – Kay

+1

अच्छा समाधान रिचर्ड –

+0

वह दूसरा समाधान मनी मैन 1 प्लस है –

2

मुझे लगता है कि (stringi के साथ) की तरह यह करना चाहते हैं:

library("stringi") 

a <- c("tim/tom meyer XY900 123kncjd", "sepp/max/peter moser VK123 456xyz") 

stri_split_fixed(stri_match_first_regex(a, "(.+?)[ ]")[,2], "/") -> start 
stri_match_first_regex(a, "[ ](.+)")[,2] -> end 


for(i in 1:length(end)){ 
    start[[i]] <- paste(start[[i]], end[i]) 
} 

unlist(start) 

## [1] "tim meyer XY900 123kncjd" "tom meyer XY900 123kncjd" "sepp moser VK123 456xyz" 
## [4] "max moser VK123 456xyz" "peter moser VK123 456xyz" 
1

यहाँ एक दृष्टिकोण है:

a <- c('tim/tom meyer XY900 123kncjd','sepp/max/peter moser VK123 456xyz'); 
do.call(c,lapply(strsplit(a,' '),function(w) apply(expand.grid(strsplit(w,'/')),1,paste,collapse=' '))); 
## [1] "tim meyer XY900 123kncjd" "tom meyer XY900 123kncjd" "sepp moser VK123 456xyz" "max moser VK123 456xyz" "peter moser VK123 456xyz" 

इस समाधान का एक लाभ यह है कि यह प्रत्येक स्ट्रिंग में सभी शब्दों के लिए विभाजन और पुनर्संयोजन करता है, बल्कि सिर्फ पहला शब्द से, ठीक से पूरा कार्तीय लौटने है सभी शब्द प्रकारों का उत्पाद:

a <- c('a/b/c d/e/f g/h/i','j/k/l m/n/o p/q/r'); 
do.call(c,lapply(strsplit(a,' '),function(w) apply(expand.grid(strsplit(w,'/')),1,paste,collapse=' '))); 
## [1] "a d g" "b d g" "c d g" "a e g" "b e g" "c e g" "a f g" "b f g" "c f g" "a d h" "b d h" "c d h" "a e h" "b e h" "c e h" "a f h" "b f h" "c f h" "a d i" "b d i" "c d i" "a e i" "b e i" "c e i" "a f i" "b f i" "c f i" "j m p" "k m p" "l m p" "j n p" "k n p" "l n p" "j o p" "k o p" "l o p" "j m q" "k m q" "l m q" "j n q" "k n q" "l n q" "j o q" "k o q" "l o q" "j m r" "k m r" "l m r" "j n r" "k n r" "l n r" "j o r" "k o r" "l o r" 
2

आर समाधान के कई तरीके हैं, यह दिखाने के लिए एक और दृष्टिकोण क्यों नहीं है। स्ट्रिंग को / प्रतीक से विभाजित करें। शेष स्ट्रिंग से पहले नाम अलग करें। फिर paste के साथ गठबंधन करें। दिलचस्प सवाल बीटीडब्ल्यू:

unlist(sapply(strsplit(a, "/"), function(x) {len <- length(x) 
    last <- gsub("^(\\w+).*", "\\1", x[len]) 
    fill <- gsub("^\\w+ ", "", x[len]) 
    paste(c(x[-len], last), fill)})) 
# [1] "tim meyer XY900 123kncjd" "tom meyer XY900 123kncjd" "sepp moser VK123 456xyz" 
# [4] "max moser VK123 456xyz" "peter moser VK123 456xyz" 
संबंधित मुद्दे