【问题标题】:Dynamic selection of rows in dataframe动态选择数据框中的行
【发布时间】:2018-01-03 17:46:47
【问题描述】:

我想在 R 中构建一个用户定义的函数,它允许用户选择数据框(子集),然后制作某种频率/交叉表。使用括号和一些 AND 和 OR 可以非常精细的选择。

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

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

# User applies it to the dataframe
subset(df , selection)

或者

df[ selection , ]

但这不起作用,但也许我错过了一些东西。或者也许还有另一种方法可以做到这一点。例如,在数据库中,您可以将查询构建为字符串然后执行。可以在此查询构建部分中包含变量以使其动态化。 R中也有可能吗?

提前感谢您的任何建议。

【问题讨论】:

  • 你为什么不直接使用dplyr::filter? IMO 非常直观 - 看看这个:dplyr.tidyverse.org/reference/filter.html.
  • 为什么一定要字符串输入?让用户提供一个表达式并像 subset 那样使用 NSE。
  • 感谢 Roland,非常有用的评论!

标签: r dataframe dynamic subset selection


【解决方案1】:

如果我们使用subset,那么我们需要evaluate

subset(df, eval(parse(text = selection)))

或者按照@Roland 的建议,创建一个表达式,而不是字符串输入,然后执行eval

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)

【讨论】:

  • 请不要建议 eval(parse()) 至少暗示通常有更好的选择。
  • 感谢 Akrun,它解决了问题。罗兰的建议也很好。
猜你喜欢
  • 2021-10-20
  • 1970-01-01
  • 2023-02-01
  • 2020-02-27
  • 2013-04-30
  • 1970-01-01
  • 2022-01-02
  • 1970-01-01
  • 2014-10-21
相关资源
最近更新 更多