【问题标题】:How can I count the number of variables in an R quosure?如何计算 R quosure 中的变量数?
【发布时间】:2019-01-18 22:33:49
【问题描述】:

假设我有一个函数,它使用非标准评估 (NSE) 接收数据帧和来自该数据帧的不同数量的变量。有没有比选择()这些变量并计算列数更快/更直接的方法来计算提供的变量的数量?

# Works but seems non-ideal
nvar <- function(df, vars) {
  vars_en <- rlang::enquo(vars)
  df_sub <- dplyr::select(df, !!vars_en)
  ncol(df_sub)
}
nvar(mtcars, mpg:hp)
#> 4

【问题讨论】:

  • 我很困惑。为什么length(vars) 不够用?
  • @MauritsEvers 你无法评估 nvar(mtcars, mpg:hp) 例如
  • @CPak 对,我现在明白了。谢谢。

标签: r dplyr tidyverse rlang tidyeval


【解决方案1】:

高度怀疑(我意识到这可能会收到反对票) - 我认为最明智的选择是像这样简单地从 data.frame 的 colnames 中选择 - 使用 tidyselect::vars_select

nvar1 <- function(df, vars) {
  vars_en <- rlang::enquo(vars)
  ans <- vars_select(names(df), !! vars_en)
  length(ans)
}

但即使这样也比select(df) %&gt;% ncol

library(microbenchmark)
library(nycflights13)
library(tidyselect)

nvar <- function(df, vars) {
  vars_en <- rlang::enquo(vars)
  df_sub <- dplyr::select(df, !!vars_en)
  ncol(df_sub)
}

identical(nvar(nycflights13::flights, day:sched_arr_time), nvar1(nycflights13::flights, day:sched_arr_time))
# TRUE

microbenchmark(nvar(nycflights13::flights, day:sched_arr_time), nvar1(nycflights13::flights, day:sched_arr_time), unit='relative', times=100L)

# Unit: relative
                                             # expr      min       lq    mean   median       uq       max neval
  # nvar(nycflights13::flights, day:sched_arr_time) 1.000000 1.000000 1.00000 1.000000 1.000000 1.0000000   100
 # nvar1(nycflights13::flights, day:sched_arr_time) 1.685793 1.680676 1.60114 1.688626 1.660196 0.9878235   100 

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-06-03
    • 1970-01-01
    • 1970-01-01
    • 2021-06-11
    • 1970-01-01
    • 2022-06-22
    • 1970-01-01
    • 2015-07-04
    相关资源
    最近更新 更多