R 数据帧中行的动态选择

R 数据帧中行的动态选择,r,dataframe,dynamic,subset,selection,R,Dataframe,Dynamic,Subset,Selection,我想在R中构建一个用户定义的函数,它允许用户对数据帧进行选择(子集),然后生成某种频率/交叉表。这些选择可以用括号和一些and和OR进行详细说明 该函数的输入是选择标准,然后必须应用于数据帧。我希望选择标准是一个字符串,它是用户定义函数的输入,这允许用户(在R方面不是很好的用户)进行选择和表格,而无需自己构建数据帧。我尝试过几种方法,使用subset(),df[[var\u name]]等,但我无法使它们动态化。理想情况如下: # User makes a selection selection

我想在R中构建一个用户定义的函数,它允许用户对数据帧进行选择(子集),然后生成某种频率/交叉表。这些选择可以用括号和一些and和OR进行详细说明

该函数的输入是选择标准,然后必须应用于数据帧。我希望选择标准是一个字符串,它是用户定义函数的输入,这允许用户(在R方面不是很好的用户)进行选择和表格,而无需自己构建数据帧。我尝试过几种方法,使用
subset()
df[[var\u name]]
等,但我无法使它们动态化。理想情况如下:

# User makes a selection
selection <- '( age > 20 & gender == 'm' ) | age > 45'

# User applies it to the dataframe
subset(df , selection)
然而,这不起作用,但也许我遗漏了什么。或者也许有另一种方法可以做到这一点。例如,在数据库中,您可以将查询构建为字符串,然后执行。变量可以包含在此querybuilding部件中,使其成为动态的。在R中也有可能吗


提前感谢您的建议。

如果我们使用的是
子集
,那么我们需要
评估

subset(df, eval(parse(text = selection)))
或者按照@Roland的建议,创建一个表达式,然后执行
eval

selection <- expression(( age > 20 & gender == 'm' ) | age > 45)
subset(df, eval(selection))
selection 20&gender='m')|年龄>45岁)
子集(测向、评估(选择))
数据
set.seed(42)

为什么不直接使用
dplyr::filter
?依我看,这是非常直观的-看看这个:。为什么它必须是字符串输入?让用户提供一个表达式并使用NSE,就像
subset
所做的那样。感谢Roland,非常有用的评论!请不要建议
eval(parse())
,至少不要暗示通常有更好的替代方案。感谢Akrun,它解决了这个问题。罗兰的建议也很好。
selection <- expression(( age > 20 & gender == 'm' ) | age > 45)
subset(df, eval(selection))
set.seed(42)
df <- data.frame(age = sample(10:60, 20, replace = TRUE),
  gender = sample(c('m', 'f'), 20, replace = TRUE), stringsAsFactors = FALSE)