【问题标题】:R progressively search string of a hierarchical lookup table for matchesR逐步搜索分层查找表的字符串以查找匹配项
【发布时间】:2022-01-08 19:27:43
【问题描述】:

我正在与OPS codes 合作,它对在医院执行的程序类型进行编码。 OPS 编码列表具有 X-XXX.XX 形式的层次结构,其中 X 是数字。编码结构是分层的,这意味着,第一个X- 是一个大集合,然后XXX 表示第一个X- 中的子集类型,最后一个.XX 表示XXX 的子专业化

所以代码可能是X-XXXX-XXX.X-XXX.XX-XXX.XX

我的问题是我们使用的程序将代码结构折叠为XXXXXXXXXXXXXXXX,我想将折叠的与未折叠的 llokup 定义表相匹配。

所以我希望有一个例程来检查每个数字,然后在执行匹配时继续下一个数字。 grepl 不会,因为 5381 将匹配 65381(未折叠的将是 5-381 和 6-538.1),这是完全不同的过程。我需要能够匹配字符到字符(第一个数字第二个数字等)并尊重字符位置的东西。

当找不到完全匹配时,它应该返回匹配相同字符位置的第一个匹配项。

伪代码中的更多示例

which("5381" %in% c("65381","53811", "5382")) 应该返回 2,因为第二项匹配所有提供的可用字符

which("5381" %in% c("538110","538111", "538221")) 应该返回1(因为它是第一个匹配项,c() 中的查找表已排序。

which("5381." %in% c("5381","538111", "538121")) 应该返回1(因为它是第一个匹配项,c() 中的查找表已排序。注意匹配中忽略句点

which("5381.1" %in% c("5381","538111", "538112")) 应该返回 2(因为它的第一个匹配匹配所有可用的五个字符,而我们没有第五个。

我知道这不是 SO 中问题的最佳示例,但我愿意改进这个问题。

【问题讨论】:

    标签: r string search lookup


    【解决方案1】:

    这可能太复杂了,但它确实有效。
    首先定义一个泛型将输入字符串转换为 OPS 格式。然后有一个匹配函数检查x 是否有y 作为子字符串。

    注意匹配函数不检查x是否是y的子串,反之亦然。

    as.ops <- function(x, ...) UseMethod("as.ops")
    as.ops.default <- function(x, ...){
      warning("The default method coerces its argument to character and calls the character method")
      as.ops.character(as.character(x))
    }
    as.ops.character <- function(x, ...){
      x <- gsub("[^[:digit:]]", "", x)
      ops1 <- substr(x, 1, 1)
      ops2 <- substr(x, 2, 4)
      ops3 <- substring(x, 5)
      y <- character(length(x))
      n <- findInterval(nchar(x), c(0, 1, 4, 7))
      y[n == 1] <- x[n == 1]
      y[n != 1] <- paste(ops1[n != 1], ops2[n != 1], sep = "-")
      o3 <- nchar(ops3) > 0
      y[n == 3 & o3] <- paste(y[n == 3 & o3], ops3[n == 3 & o3], sep = ".")
      y
    }
    ops_match <- function(x, y){
      xo <- as.ops(x)
      yo <- as.ops(y)
      i <- (xo %in% yo) | grepl(yo, xo)
      which(i)
    }
    
    x1 <- c("65381","53811", "5382")
    x2 <- c("538110","538111", "538221")
    x3 <- c("5381","538111", "538121")
    x4 <- c("5381","538111", "538112")
    y1 <- y2 <- "5381"
    y3 <- "5381."
    y4 <- "5381.1"
    
    ops_match(x1, y1)
    ops_match(x2, y2)
    ops_match(x3, y3)
    ops_match(x4, y4)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-07-06
      • 2018-04-09
      • 1970-01-01
      • 2017-09-12
      • 1970-01-01
      • 1970-01-01
      • 2019-07-21
      相关资源
      最近更新 更多