2016-09-21 5 views
1

Das folgende Skript teilt den Artikelcode;String Splitting in R

Beispiel

MR32456 in MR324, MR325, MR326.

MR3091011 in MR309, MR301, MR300, MR301, MR301

Wie soll ich das Skript ändern, so dass für MR3091011 es in MR309, MR310, MR311 geteilt wird?

rule2 <- c("MR") 
    df_1 <- test[grep(paste("^",rule2,sep="",collapse = "|"),test$Name.y),] 

SpaceName_1 <- function(s){ 
    num <- str_extract(s,"[0-9]+") 
    if(nchar(num) >3){ 
    former <- substring(s, 1, 4) 
    latter <- strsplit(substring(s,5,nchar(s)),"") 
    latter <- unlist(latter) 
    return(paste(former,latter,sep = "",collapse = ",")) 
    } 
    else{ 
    return (s) 
    } 
} 

df_1$Name.y <- sapply(df_1$Name.y, SpaceName_1) 
+1

Verwandte, vielleicht duplizieren: http://stackoverflow.com/questions/39591010 – zx8754

+0

Zimmernummern sind immer 3 Ziffern? – zx8754

+1

Ich denke im ersten Fall hast du einen Tippfehler. Sollte es nicht 'MR326' sein? – akrun

Antwort

0

Versuchen Sie folgendes:

str <- 'MR3091011' 
paste(substring(str,1,4), strsplit(str,"")[[1]][-(1:4)], sep='') 

[1] "MR309" "MR301" "MR300" "MR301" "MR301" 

für eine Liste von Zeichenketten können Sie versuchen:

strlst <- c("MR32456", "MR3091011") 
lapply(strlst, function(str) paste(substring(str,1,4), 
            strsplit(str,"")[[1]][-(1:4)], sep=''))  
[[1]] 
[1] "MR324" "MR325" "MR326" 

[[2]] 
[1] "MR309" "MR301" "MR300" "MR301" "MR301" 

[EDIT]

groups <- unlist(strsplit(sub('([[:alpha:]]+)(\\d)(\\d{2})(\\d{2})(\\d{2})', '\\1 \\2 \\3 \\4 \\5', 'MR3091011'), split=' ')) 
paste0(groups[1], groups[2], groups[3:5]) 
# [1] "MR309" "MR310" "MR311" 
+1

@Sotos: ja habe OP falsch, aktualisiert mit einer Regexp-basierten Lösung. –

2

eine Split-Funktion von this post Leihen und Vektorisierung es, was wir tun können die folgenden,

fun1 <- function(x){ 
    sapply(seq(from=1, to=nchar(substr(x, 4, nchar(x))), by=2), function(i) substr(substr(x, 4, nchar(x)), i, i+1)) 
} 

fun1 <- Vectorize(fun1) 

Map(paste0, substr(x, 1, 3), fun1(x)) 

#$MR3 
#[1] "MR309" "MR310" "MR311" 

#$MR3 
#[1] "MR324" "MR356"