【问题标题】:String splitting in R ProgrammingR编程中的字符串拆分
【发布时间】:2016-09-20 09:54:27
【问题描述】:

目前,下面的脚本正在将组合的项目代码拆分为特定的项目代码。

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)

例如, 组合项目代码:324-326 室正在拆分为MR324 MR325 MR326

但是对于这个特定的组合项目代码:309-311 室 正在拆分为 MR309 MR300 MR301

我应该如何修改脚本给我 MR309 MR310 MR311?

【问题讨论】:

  • 我怀疑df_1$Name.y &lt;- sapply(df_1$Name.y, SpaceName_1) 在拆分后会起作用,因为我们将创建一个比原始行更多的列。

标签: r split


【解决方案1】:

您可以尝试以下方法:

range <- "324-326"
x <- as.numeric(unlist(strsplit(range, split="-")))
paste0("MR", seq(x[1], x[2]))

[1] "MR324" "MR325" "MR326"

我假设你可以通过某种方式获得数字房间序列,然后使用我上面给你的sn-p。

如果您的组合项目代码始终具有Room xxx-yyy 的形式,那么您可以使用gsub 提取范围:

range <- gsub("Room ", "", "Room 324-326")

如果您的商品代码位于名为 codes 的向量中,那么您可以使用以下方法获取范围向量:

ranges <- sapply(codes, function(x) gsub("Room ", "", x))

【讨论】:

  • 我有多个输入,例如 Room 309-311、Room 308-310、Room 324-326、Room 334-336 等。输入 Room 324-326 和 Room 334-336 正确拆分为 MR324 , MR325, MR326 和 MR334, MR335, MR336 分别,但是 Room 309-311 和 Room 308-310 等输入没有正确拆分。对于 309-311 房间,脚本错误地将其拆分为 MR309、MR300、MR301。我希望脚本将其拆分为 MR309、MR310、MR311
【解决方案2】:

我们还可以在将- 替换为: 然后将paste 替换为前缀“MR”后评估字符串。

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"

【讨论】:

    猜你喜欢
    • 2014-07-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-12
    • 2015-08-30
    • 1970-01-01
    相关资源
    最近更新 更多