Evaluate different logical conditions from string for each row

One straightforward and easy solution would be using eval(parse...

library(dplyr)

df %>%
  rowwise() %>%
  mutate(goal = eval(parse(text = condition)))

# A tibble: 9 x 3
#  value condition     goal 
#  <dbl> <chr>         <lgl>
#1 0.46  value > 0.5   FALSE
#2 0.96  value == 0.79 FALSE
#3 0.45  value <= 0.65 TRUE 
#4 0.68  value == 0.88 FALSE
#5 0.570 value < 0.9   TRUE 
#6 0.1   value > 0.01  TRUE 
#7 0.9   value >= 0.6  TRUE 
#8 0.25  value < 0.91  TRUE 
#9 0.04  value > 0.2   FALSE

However, I would recommend reading some posts before using it.


Not entirely sure whether you are looking for something like this, however, you can also use lazy_eval() from lazyeval:

df %>%
 rowwise() %>%
 mutate(res = lazy_eval(sub("value", value, condition)))

  value condition     res  
  <dbl> <chr>         <lgl>
1 0.46  value > 0.5   FALSE
2 0.96  value == 0.79 FALSE
3 0.45  value <= 0.65 TRUE 
4 0.68  value == 0.88 FALSE
5 0.570 value < 0.9   TRUE 
6 0.1   value > 0.01  TRUE 
7 0.9   value >= 0.6  TRUE 
8 0.25  value < 0.91  TRUE 
9 0.04  value > 0.2   FALSE

And even though it is very close to eval(parse(...)), a possibility is also using parse_expr() from rlang:

df %>%
 rowwise() %>%
 mutate(res = eval(rlang::parse_expr(condition)))

Using match.fun:

# get function, and the value
myFun <- lapply(strsplit(df1$condition, " "), function(i){
  list(f = match.fun(i[ 2 ]), 
       v = as.numeric(i[ 3 ]))
})

df1$goal <- mapply(function(x, y){ 
  x[[ "f" ]](y, x[ "v" ])
  }, x = myFun, y = df1$value)

#   value     condition  goal
# 1  0.46   value > 0.5 FALSE
# 2  0.96 value == 0.79 FALSE
# 3  0.45 value <= 0.65  TRUE
# 4  0.68 value == 0.88 FALSE
# 5  0.57   value < 0.9  TRUE
# 6  0.10  value > 0.01  TRUE
# 7  0.90  value >= 0.6  TRUE
# 8  0.25  value < 0.91  TRUE
# 9  0.04   value > 0.2 FALSE

Tags:

R

Nse

Dplyr