从每一行的字符串中评估不同的逻辑条件

Hum*_*hen 6 r dplyr nse

我有一个data.frame这样的:

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

structure(list(value = c(0.46, 0.96, 0.45, 0.68, 0.57, 0.1, 0.9, 
0.25, 0.04), condition = c("value > 0.5", "value == 0.79", "value <= 0.65", 
"value == 0.88", "value < 0.9", "value > 0.01", "value >= 0.6", 
"value < 0.91", "value > 0.2")), class = "data.frame", row.names = c(NA, 
-9L))

Run Code Online (Sandbox Code Playgroud)

我想评估condition每一行的列中的字符串。

因此结果将如下所示。

  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
Run Code Online (Sandbox Code Playgroud)

我想dplyr框架内有一个方便的NSE解决方案。我曾尝试用!!expr()等。当尝试通过condition使用 子集时,我得到了一些有希望的结果

result <- df[0,]
for(i in 1:nrow(df)) { 
  result <- rbind(result, filter_(df[i,], bquote(.(df$condition[i]))))
}

Run Code Online (Sandbox Code Playgroud)

但是我不喜欢这种解决方案,这也不是我所追求的。

我希望有人能帮帮忙。

更新:我试图避免eval(parse(..))

Ron*_*hah 5

一种简单易行的解决方案是使用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
Run Code Online (Sandbox Code Playgroud)

不过,我建议在使用它之前阅读一些文章。


tmf*_*mnk 5

不完全确定您是否正在寻找类似的东西,但是,您也可以使用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
Run Code Online (Sandbox Code Playgroud)

即使它非常接近eval(parse(...)),也有可能使用parse_expr()from rlang

df %>%
 rowwise() %>%
 mutate(res = eval(rlang::parse_expr(condition)))
Run Code Online (Sandbox Code Playgroud)