图案大于符号

时间:2019-11-13 15:51:43

标签: r regex

我想从变量中清除特殊字符。

mm = data.frame(rule = c('$X <= 0', '$X > 0 & $X <= 17.5', '> 17.5 & $X <= 197.3', '$X > 197.3'))
mm$ruleclean <- gsub('\\&',' ',gsub('\\s+','',gsub('\\$X', '', mm$rule)))

所需的输出:

<=0
0 - 17.5
17.5 - 197.3
> 197.3

目标是将其转换为间隔

1 个答案:

答案 0 :(得分:2)

这是逐字尝试,当然容易出现问题。我使用magrittr的管道运算符%>%来简化代码(以及@camille关于嵌套gsub的注释行),尽管函数并非严格要求。另外,我将第一个值从0更改为-1只是为了证明您可能会对负数产生歧义。

mm = data.frame(rule = c('$X <= -1', '$X > 0 & $X <= 17.5', '> 17.5 & $X <= 197.3', '$X > 197.3'))

library(magrittr)
gsub("&", "", mm$rule) %>%
  gsub("(\\s*\\$X\\s*)?<=?\\s*", "..", .) %>%
  gsub("(\\$X\\s*)?>=?\\s*", "", .) %>%
  gsub("^\\.\\.", "<=", .) %>%
  gsub("(-[0-9.]+)", "(\\1)", .) %>%
  gsub("\\.\\.", "-", .) %>%
  gsub("^([0-9.]+)$", ">\\1", .)
# [1] "<=(-1)"     "0-17.5"     "17.5-197.3" ">197.3"     

编辑:更正了最后一个字符串。)

我认为将来可以做到这一点的一种方法不是在头/尾字符串中对前导<=>进行硬编码,因为它更健壮。此外,出于某些原因,我个人可能更喜欢使用(,-1](或(-Inf,-1]),(0,17.5]等语言来表示封闭/开放端的数学命名法:并且与R的cut因子水平一致。