R逐步搜索分层查找表的字符串以查找匹配项



我正在使用OPS代码,该代码对医院执行的程序类型进行编码。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中问题的最好例子,但我愿意改进这个问题。

这可能太复杂了,但它可以工作
首先定义一个泛型,将输入字符串转换为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)

最新更新