判断数值区间是否与指定区间字符串重叠(R语言)
问题
你定义了数值区间:
rg <- 25:46
需要判断该区间内是否存在任意数值落在给定的区间字符串:
lrg <- "1:26,48:56,78:99,121:143,165:204,226:243,265:268,290:316"
的某个区间中,返回TRUE/FALSE。但你尝试的代码始终返回FALSE:
for (i in str_split(lrg,',')){ print(noquote(i) %in% rg)}
为啥你的代码不行
str_split(lrg, ',')返回的是列表,直接用for (i in 列表)只会循环一次,把整个列表内容赋给i,根本没遍历到每个区间字符串。- 你拿区间字符串(比如"1:26")和数值向量
rg做%in%判断,字符串和数值类型不匹配,肯定永远返回FALSE。
正确解决办法
方法1:循环逐个检查区间
library(stringr) rg <- 25:46 lrg <- "1:26,48:56,78:99,121:143,165:204,226:243,265:268,290:316" # 把区间字符串拆成单个区间的向量 interval_list <- str_split(lrg, ',')[[1]] result <- FALSE for (interval in interval_list) { # 拆分每个区间的起止值,转成整数 bounds <- as.integer(str_split(interval, ':')[[1]]) # 生成当前区间的数值序列 current_range <- bounds[1]:bounds[2] # 检查两个区间有没有交集,有就设为TRUE并跳出循环 if (length(intersect(rg, current_range)) > 0) { result <- TRUE break } } print(result) # 输出TRUE
方法2:向量式写法(更简洁高效)
library(stringr) rg <- 25:46 lrg <- "1:26,48:56,78:99,121:143,165:204,226:243,265:268,290:316" # 把区间字符串转换成起止数值的矩阵 intervals <- str_split(lrg, ',')[[1]] |> str_split_fixed(':', 2) |> as.integer() |> matrix(ncol = 2) # 检查rg里有没有数落在任意一个区间内 result <- any(sapply(1:nrow(intervals), function(row) { any(rg >= intervals[row,1] & rg <= intervals[row,2]) })) print(result) # 输出TRUE
内容的提问来源于stack exchange,提问作者Ahk86
相关产品推荐
相关产品推荐

