有時,考慮最好的演算法是很棘手的。好吧,我必須使用“字母/數字/數字”形式的某些范圍,例如 X86-Z95 將是一個范圍。實際上我需要查看給定的代碼是否在代碼范圍內。我想我會生成一個包含范圍的陣列并檢查代碼是否在陣列中。但是由于我有很多作業來實作演算法,我認為有一種更簡單的方法來實作它。我希望看到一些更有效或更優雅的解決方案。我把我的代碼留在下面。
提前致謝!
library(stringr)
generateInterval = function(str_interval) {
limits = strsplit(str_interval, '-')[[1]]
letters_limits = substr(limits, 1, 1)
numbers_limits = as.numeric(substr(limits, 2, 3))
if (letters_limits[1] == letters_limits[2]) {
interval = paste0(letters_limits[1], numbers_limits[1]:numbers_limits[2])
} else {
pos = which(LETTERS %in% letters_limits)
interval_letters = LETTERS[pos[1]:pos[2]]
numbers = as.numeric(substr(limits, 2, 3))
interval = c()
for (i in 1:length(interval_letters)) {
if (i == 1) {
interval = c(interval, paste0(interval_letters[i], numbers[1]:99))
} else if (i == length(interval_letters)) {
interval = c(interval, paste0(interval_letters[i], 0:numbers[2]))
} else {
interval = c(interval, paste0(interval_letters[i], 0:99))
}
}
}
interval = ifelse(str_length(interval) == 2,
paste0(substr(interval, 1, 1), 0, substr(interval, 2, 2)),
interval)
return(interval)
}
generateInterval('A72-B10')
uj5u.com熱心網友回復:
在此處遵循OP 的評論是基本 R 中的一種方式。唯一需要做的就是意識到 R 可以比較字串。并且單行功能將檢查代碼是否在范圍內。
within_range <- function(x, lower, upper) lower <= x & x <= upper
within_range(c("X92", "X84", "A10", "Y30"), lower = "X86", upper = "Z95")
#> [1] TRUE FALSE FALSE TRUE
由reprex 包于 2022-02-11 創建(v2.0.1)
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/424344.html
