在我提出问题之前,这里有一点背景。
我正在创建一个通用的数据成形和图表库,用于绘制特定格式的调查数据。
作为脚本的一部分,我在数据框中使用了subset函数。我的工作方式是有一个参数文件,可以在其中将子设置条件传递到函数中(因此,无需直接编辑主库)。我这样做的方式如下:
subset_criteria <- expression(variable1 != "" & variable2 == TRUE)
(例如,其中variable1和variable2是我的数据框中的列)。
然后在我的函数中,我将其称为:
my.subset <- subset(my.data, eval(subset_criteria))
这部分工作完全符合我的要求。但是,现在我想基于只能在函数内部执行的其他一些计算来增加函数内部的子设置标准。因此,我试图找到一种将这些子集表达式组合在一起的方法。
想象一下,在函数内部我会在数据框中自动创建一些新列,然后向其子集中添加一个条件,表明该附加列必须为TRUE。
基本上,我会执行以下操作:
my.data$newcolumn <- with(my.data, ifelse(...some condition..., TRUE, FALSE))
然后我希望我的子集最终成为:
my.subset <- subset(my.data, eval(subset_criteria & newcolumn == TRUE))
但这似乎并不简单地完成我上面列出的内容。我得到了错误的解决方案。因此,我正在寻找一种使用expression和eval组合这些表达式的方法,以便从本质上获得所有条件的组合。
感谢任何指针。如果我能不必重写所有表达式就可以做到这一点,那就太好了,但是我知道这可能是需要的...
鲍勃
答案 0 :(得分:2)
您可能应该避免两件事:在非交互式设置中使用subset
(请参见帮助页面中的警告)和eval(parse())
。我们走了。
您可以将表达式更改为字符串,然后将其添加到任意位置。诀窍是将字符串转换回表达式。这就是前面提到的parse
出现的地方。
sub1 <- expression(Species == "setosa")
subset(iris, eval(sub1))
sub2 <- paste(sub1, '&', 'Petal.Width > 0.2')
subset(iris, eval(parse(text = sub2))) # your case
> subset(iris, eval(parse(text = sub2)))
Sepal.Length Sepal.Width Petal.Length Petal.Width Species
6 5.4 3.9 1.7 0.4 setosa
7 4.6 3.4 1.4 0.3 setosa
16 5.7 4.4 1.5 0.4 setosa
17 5.4 3.9 1.3 0.4 setosa
18 5.1 3.5 1.4 0.3 setosa
19 5.7 3.8 1.7 0.3 setosa
20 5.1 3.8 1.5 0.3 setosa
22 5.1 3.7 1.5 0.4 setosa
24 5.1 3.3 1.7 0.5 setosa
27 5.0 3.4 1.6 0.4 setosa
32 5.4 3.4 1.5 0.4 setosa
41 5.0 3.5 1.3 0.3 setosa
42 4.5 2.3 1.3 0.3 setosa
44 5.0 3.5 1.6 0.6 setosa
45 5.1 3.8 1.9 0.4 setosa
46 4.8 3.0 1.4 0.3 setosa