2016-09-21 19 views
1

以下のスクリプトは商品コードを分割しています。Rで分割された文字列

MR324, MR325, MR326

MR32456MR3091011のために、それはMR309, MR310, MR311に分割するようにMR309, MR301, MR300, MR301, MR301

MR3091011どのように私は、スクリプトを修正する必要がありますか?

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

関連は、多分複製:http://stackoverflow.com/questions/39591010 – zx8754

+0

ルーム番号は常に3桁の数字ですか? – zx8754

+1

私は最初のケースでは、あなたはタイプミスがあると思います。 'MR326'でなければならない – akrun

答えて

0

これを試してみてください:

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

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

を文字列のリストのためにあなたが試すことができます:

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:はい、OPが間違っていて、regexpベースのソリューションで更新されました。 –

2

this postからスプリット機能を借りて、それをベクトル、我々は次の操作を行うことができ、

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" 
関連する問題