我想从变量中清除特殊字符。
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
目标是将其转换为间隔
答案 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
因子水平一致。