我正在使用 R,并且我有一个 df,其列的 bin 遵循以下两种格式之一:
(x.xx,y.yy] or (x.xx,y.yy)
它们都是具有多个小数的正整数
我想把它们分成
lower upper
x.xx y.yy
我首先过滤掉 bin 列中的所有 NA(有一些跨多个 dfs):
filter(!is.na(bin))
我目前正在使用这个正则表达式:
mutate(
lower = as.numeric(sub("^[\\(\\[]([0-9.-]+),", "\\1", bin))
upper = as.numeric(sub(",([0-9.-]+)[\\)\\]]$", "\\1", bin))
)
但它产生所有 NA
我没有尝试过很多替代方案,任何帮助将不胜感激,并提前感谢您
这是一个测试数据示例:
> test_bins <- c("[0.15,0.273]", "(0.273,0.397]", "(0.397,0.52]", "[0.52,0.643]")
> lower_values <- sapply(test_bins, function(x) as.numeric(sub("^[\\[\\(]([0-9.]+),", "\\1", x)))
Warning messages:
1: In FUN(X[[i]], ...) : NAs introduced by coercion
2: In FUN(X[[i]], ...) : NAs introduced by coercion
3: In FUN(X[[i]], ...) : NAs introduced by coercion
4: In FUN(X[[i]], ...) : NAs introduced by coercion
> upper_values <- sapply(test_bins, function(x) as.numeric(sub(",([0-9.]+)[\\)\\]]$", "\\1", x)))
Warning messages:
1: In FUN(X[[i]], ...) : NAs introduced by coercion
2: In FUN(X[[i]], ...) : NAs introduced by coercion
3: In FUN(X[[i]], ...) : NAs introduced by coercion
4: In FUN(X[[i]], ...) : NAs introduced by coercion
> data.frame(test_bins, lower_values, upper_values)
test_bins lower_values upper_values
[0.15,0.273] [0.15,0.273] NA NA
(0.273,0.397] (0.273,0.397] NA NA
(0.397,0.52] (0.397,0.52] NA NA
[0.52,0.643] [0.52,0.643] NA NA
我怀疑你是从 OpenAI GPT 模型中得到这个:我试图问同样的问题,LLM 给出了非常相似的错误答案。
问题是您使用的
sub
函数没有 perl=TRUE
参数,这意味着该模式是使用默认的 TRE 正则表达式引擎处理的。在 TRE 模式中,括号表达式内的特殊字符无法转义。相反,你需要使用“智能放置”。
此外,您只匹配输入字符串的一部分,所有未匹配的内容都保留在结果字符串中。要使用
sub
“提取”值,您必须匹配整个字符串,因此只需在两个表达式中添加 .*
即可。
如果您想使用自己的正则表达式,则需要按如下方式重新修改它们:
^[([]([0-9.-]+),.*
检测“较低”值,.*,([0-9.-]+)[])]$
定义较高值。
test_bins <- c("[0.15,0.273]", "(0.273,0.397]", "(0.397,0.52]", "[0.52,0.643]")
lower_values <- as.numeric(sub("^[[(]([0-9.]+),.*", "\\1", test_bins))
upper_values <- as.numeric(sub(".*,([0-9.-]+)[])]$", "\\1", test_bins))
data.frame(test_bins, lower_values, upper_values)
# test_bins lower_values upper_values
# 1 [0.15,0.273] 0.150 0.273
# 2 (0.273,0.397] 0.273 0.397
# 3 (0.397,0.52] 0.397 0.520
# 4 [0.52,0.643] 0.520 0.643
此处,
[[(]
匹配 [
或 (
([
不得在方括号表达式内转义),[])]
匹配 ]
或 )
(当 ]
为打开后立即放置[
,它被解析为文字 ]
字符)。