为每一行从字符串评估不同的逻辑条件 [英] Evaluate different logical conditions from string for each row

查看:23
本文介绍了为每一行从字符串评估不同的逻辑条件的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有一个像这样的 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))

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

I would like to evaluate the strings in the condition column for every row.

所以结果看起来像这样.

So the result would look like this.

  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

我想在 dplyr 框架中有一个方便的 NSE 解决方案.我已经尝试过 !!expr() 等.尝试使用

I suppose there is a handy NSE solution within the dplyr framework. I have experimented with !! and expr() and others. I got some promising results when trying to subset by condition using

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

但我不喜欢这个解决方案,这也不是我想要的.

But I don't like the solution and it's not exactly what I'm after.

希望有人能帮忙.

UPDATE:我试图避免 eval(parse(..)).

推荐答案

不完全确定您是否正在寻找类似的东西,但是,您也可以使用 lazyeval 中的 lazy_eval():

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

尽管它非常接近 eval(parse(...)),但也有可能使用 rlang 中的 parse_expr()代码>:

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)))

这篇关于为每一行从字符串评估不同的逻辑条件的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆