目前,下面的脚本将组合的商品代码拆分为特定的商品代码。
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)
实施例, 合并项目代码: Room 324-326 分为 MR324 MR325 MR326 。
但是对于此特定组合项目代码:会议室309-311 正在分为 MR309 MR300 MR301 。
我应该如何修改脚本给MR309 MR310 MR311?
答案 0 :(得分:5)
您可以尝试以下几点:
range <- "324-326"
x <- as.numeric(unlist(strsplit(range, split="-")))
paste0("MR", seq(x[1], x[2]))
[1] "MR324" "MR325" "MR326"
我假设你可以通过某种方式获得数字房间序列,然后使用我上面给你的片段。
如果您的组合商品代码的格式始终为Room xxx-yyy
,那么您可以使用gsub
提取范围:
range <- gsub("Room ", "", "Room 324-326")
如果您的商品代码位于名为codes
的向量中,那么您可以使用以下方式获取范围向量:
ranges <- sapply(codes, function(x) gsub("Room ", "", x))
答案 1 :(得分:1)
我们还可以在用-
替换:
后再用paste
前缀&#34; MR&#34;来评估字符串。
paste0("MR", eval(parse(text=sub("\\S+\\s+(\\d+)-(\\d+)", "\\1:\\2", range))))
#[1] "MR324" "MR325" "MR326"
将其作为便利的功能包装
fChange <- function(prefixStr, RangeStr){
paste0(prefixStr, eval(parse(text=sub("\\S+\\s+(\\d+)-(\\d+)",
"\\1:\\2", RangeStr))))
}
fChange("MR", range)
fChange("MR", range1)
#[1] "MR309" "MR310" "MR311"
对于多个元素,只需循环并应用函数
sapply(c(range, range1), fChange, prefixStr = "MR")
range <- "Room 324-326"
range1 <- "Room 309-311"