R 将不等式表达式(字符)解析为数值范围

R 将不等式表达式(字符)解析为数值范围,r,R,获得不等式表达式(字符)上下限的正确方法是什么。以下是一个例子: df = structure(list(expressions = c("x<1", "x>1", "x==1", "x<=1", "x>=1")), .Names = "expressions", class = "data.frame", row.names = c(NA, -5L)) 当只有时,将1e-5添加到数字中。一种完全不同的方法可能无法满足您的要求。 但我认为,如果最终目标是使用实际数据

获得不等式表达式(字符)上下限的正确方法是什么。以下是一个例子:

df = structure(list(expressions = c("x<1", "x>1", "x==1", "x<=1", 
"x>=1")), .Names = "expressions", class = "data.frame", row.names = c(NA, 
-5L))

当只有
时,将
1e-5
添加到数字中。

一种完全不同的方法可能无法满足您的要求。 但我认为,如果最终目标是使用实际数据的范围,那么实际上也可以选择这种方法

如果不是,那么值得一试:

library(dplyr)

expressions = c('x < 1','x > 1','x == 1','x <= 1','x >= 1')

df <- data.frame(x = seq(0,2,by=1e-05))

df %>% mutate_(.dots=setNames(expressions, seq_along(expressions))) %>%
  gather(key,value, -x) %>% mutate(u = ifelse(value,x,NA)) %>%
  group_by(key) %>% summarise(minimum = min(u, na.rm=T), maximum = max(u, na.rm=T)) %>%
  mutate(key = factor(key, labels=expressions))
库(dplyr)
表达式=c('x<1','x>1','x==1','x=1')
df%mutate_(.dots=setNames(表达式,沿(表达式))排序)%>%
聚集(键,值,-x)%%>%mutate(u=ifelse(值,x,NA))%%>%
分组依据(关键)%>%总结(最小值=最小值(u,na.rm=T),最大值=最大值(u,na.rm=T))%>%
变异(键=因子(键,标签=表达式))
结果:

# A tibble: 5 × 3
     key minimum maximum
  <fctr>   <dbl>   <dbl>
1  x < 1 0.00000 0.99999
2  x > 1 1.00001 2.00000
3 x == 1 1.00000 1.00000
4 x <= 1 0.00000 1.00000
5 x >= 1 1.00000 2.00000    
#一个tible:5×3
键最小值最大值
1 x<10.000000.99999
2x>11.00001.00000
3 x==11.000001.00000
4 x=11.000002.00000
#功能
foo=函数(等式,δ=1e-5){
#提取表达式的数字部分
n=作为数字(gsub(“\\D+”,“”,eq))
#创建向量x
x=c(-Inf,n-delta,n,n+delta,Inf)
#通过插入x和x的子集值(如果为真)来计算eq
y=x[eval(expr=parse(text=eq))]
返回(范围(y))
}
t(sapply(df$expressions,foo))
#        [,1]    [,2]
#x1 1.00001 Inf
#x==11.000001.00000
#x=1.00000INF

为什么不编写一个函数,将不等式表达式作为字符输入,
x
作为数字输入?正如你所说,
gsub
如果。。。else
做这个把戏。你说:“当只有哦对不起,现在我明白了。“数字”当然是1。无论如何,一个简单的函数应该可以做到这一点。
# A tibble: 5 × 3
     key minimum maximum
  <fctr>   <dbl>   <dbl>
1  x < 1 0.00000 0.99999
2  x > 1 1.00001 2.00000
3 x == 1 1.00000 1.00000
4 x <= 1 0.00000 1.00000
5 x >= 1 1.00000 2.00000    
#FUNCTION
foo = function(eq, delta = 1e-5){
    #Extract the numerical portion of the expression
    n = as.numeric(gsub("\\D+", "", eq))

    #Create vector x
    x = c(-Inf, n - delta, n, n + delta, Inf)

    #Evaluate eq by plugging in x and subset values of x where TRUE
    y = x[eval(expr = parse(text = eq))]

    return(range(y))
}

t(sapply(df$expressions, foo))
#        [,1]    [,2]
#x<1     -Inf 0.99999
#x>1  1.00001     Inf
#x==1 1.00000 1.00000
#x<=1    -Inf 1.00000
#x>=1 1.00000     Inf