R dplyr 对仅由其字符串名称已知的列进行操作

标签 r dynamic dplyr quoting rlang

我正在使用 dplyr 进行编程在 R 中对仅通过其字符串名称已知的数据框列进行操作。我知道最近有更新 dplyr支持 quosures 等,我已经在这里审查了我认为是新的“使用 dplyr 编程”文章的相关组件:http://dplyr.tidyverse.org/articles/programming.html .但是,我仍然无法做我想做的事。

我的情况是我只通过字符串名称知道数据框的列名。因此,我不能在调用 dplyr 时使用非标准评估。在一个函数或什至一个脚本中,列名可能会在运行之间发生变化,因为我通常无法对未加引号的(即“裸”)列名进行硬编码。我想知道如何解决这个问题,我猜我忽略了一些新的引用/取消引用语法。

例如,假设我有用户输入定义数据分布的截止百分位数。用户可以使用他/她想要的任何百分位数运行代码,他/她选择的百分位数将改变输出。在分析中,中间数据框中的一列使用所用百分位数的名称创建;因此,此列的名称会根据用户输入的截止百分位数而变化。

下面是一个最小的例子来说明。我想使用截止百分位数的各种值调用该函数。我想要名为 MPGCutoffs 的数据框有一个根据选择的截止分位数命名的列(目前在下面的代码中有效),我想稍后对这个列名进行操作。由于这个列名的通用性,我只能从输入pctCutoff的角度知道它在编写函数的时候,所以我需要一种方法在只知道由 probColName 定义的字符串时对其进行操作,它遵循基于 pctCutoff 的值的预定义模式.

userInput_prob1 <- 0.95
userInput_prob2 <- 0.9

# Function to get cars that have the "best" MPG
# fuel economy, where "best" is defined by the
# percentile cutoff passed to the function.
getBestMPG <- function( pctCutoff ){

  # Define new column name to hold the MPG percentile cutoff.
  probColName <- paste0('P', pctCutoff*100)

  # Compute the MPG percentile cutoff by number of gears.
  MPGCutoffs <- mtcars %>%
    dplyr::group_by( gear ) %>%
    dplyr::summarize( !!probColName := quantile(mpg, pctCutoff) )

  # Filter mtcars with only MPG values above cutoffs.
  output <- mtcars %>%
    dplyr::left_join( MPGCutoffs, by='gear' ) %>%
    dplyr::filter( mpg > !!probColName ) #****This doesn't run; this is where I'm stuck

  # Return filtered data.
  return(output)
}

best_1 <- getBestMPG( userInput_prob1 )
best_2 <- getBestMPG( userInput_prob2 )
dplyr::filter()声明是我无法正常运行的内容。我试过了:
dplyr::filter( mpg > probColName ) - 没有错误,但没有返回行。
dplyr::filter( mpg > !!probColName ) - 没有错误,但没有返回行。

我还看过一些例子,我可以通过类似 quo(P95) 的东西。到函数,然后在对 dplyr::filter() 的调用中取消引用它;我已经让它工作了,但它没有解决我的问题,因为它需要在函数之外对变量名进行硬编码。例如,如果我这样做并且用户传递的百分位数为 0.90,则调用 dplyr::filter()失败,因为创建的列名为 P90而不是 P95 .

任何帮助将不胜感激。我希望有一个简单的解决方案,我只是忽略了。

最佳答案

如果您在字符串(又名字符向量)中有一个列名,并且您想将它与 tidyeval 一起使用,那么您可以使用 rlang::sym() 将其隐藏起来。 .只是改变

dplyr::filter( mpg > !!rlang::sym(probColName) )

它应该工作。这是从这个 github 问题的建议中获取的:https://github.com/tidyverse/rlang/issues/116

使用还是可以的
dplyr::summarize( !!probColName := quantile(mpg, pctCutoff) )

因为在动态设置参数名称时,您只需要字符串而不是未引用的符号。

关于R dplyr 对仅由其字符串名称已知的列进行操作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46310123/

相关文章:

r - 从 dplyr 中的日期范围计算每年的观测值

c++ - 如何在CPP中删除动态非矩形二维数组

javascript - 在动态内容上触发 jQuery datetimepicker

sql - T-SQL 动态枢轴

r - 将参数传递给使用 dplyr R 的函数内的回归模型

r - 在 R 中按日期绘制箱线图

r - 并行加载文件不适用于 foreach + data.table

r - 使用 dplyr 铅但有一些限制

r - 在 dplyr 过滤器行中 NA 数量大于 1

r - 使用 dplyr 在组内安排