【问题标题】:Reference to a variable without the quotation marks引用不带引号的变量
【发布时间】:2021-12-07 16:10:23
【问题描述】:

我想编写一个函数,该函数将一个数据框及其一个因子变量作为输入,并为输出一个具有该因子的不同级别和每个级别的出现次数的数据框。

这是一个执行此操作的代码:

df <- data.frame(ID = sample(c("a", "b", "c", "d"), 20, rep=TRUE))
df %>% group_by(ID) %>% summarise(no_rows = length(ID)) %>% arrange(desc(no_rows))

但我不知道如何将其放入函数中,因为变量 (ID) 的名称不在第二行的引号内。

f <- function(df, var){
   df %>% group_by(var) %>% summarise(no_rows = length(var)) %>% arrange(desc(no_rows))
}

f(df, ID) 不起作用。而且我不能写 f(df, "ID")。

【问题讨论】:

    标签: r


    【解决方案1】:

    使用dplyr::count 和非标准评估(参见this SO posttidyverse documentation)结合参数sort = TRUE

    library(dplyr)
    f <- function(df, var) df %>% count({{ var }}, name = "no_rows", sort = T)
    
    set.seed(1) # using seed for reproducibility
    df <- data.frame(ID = sample(c("a", "b", "c", "d"), 20, rep=TRUE))
    
    f(df, ID)
      ID no_rows
    1  b       7
    2  a       6
    3  c       6
    4  d       1
    

    【讨论】:

    • 很高兴指出{{ var }} 一举完成var &lt;- rlang::enquo(var)!!var 分两步完成的工作。
    • 我还有一个与此相关的问题:我将如何使用 var,就像它实际上是 var 一样。这是一个示例: which(colnames(df) == var) 不起作用,我尝试了 which(colnames(df) == !!var) 但它仍然不起作用。它需要被视为 which(colnames(df)) == "var")。如何管理?
    • @armandfavrot 你在什么情况下尝试这个?在一个函数内?在tidyverse 管道内? !!{{ 只能在 tidyverse 动词中使用,colnames 不是。看看deparse(substitute(var))this book chapter。如果出现更多问题,请考虑打开一个单独的问题,因为这只是松散相关。
    • @DonaldSeinen 我在一个函数中尝试这个,同一个函数 f(我想添加一些引用“var”而不是 var 的行,而 deparse(substitute(var)) 就是我的样子正在寻找,再次感谢!
    【解决方案2】:
    f <- function(df,var){
       var <- enquo(var)
       df %>% group_by(!!var) %>% summarise(no_rows = length(!!var)) %>% arrange(desc(no_rows))
    }
    

    这样更新函数,

    f(df, ID)
    

    输出;

      ID    no_rows
      <chr>   <int>
    1 a           6
    2 d           6
    3 b           4
    4 c           4
    

    【讨论】:

    • 我还有一个与此相关的问题:我将如何使用 var,就像它实际上是 var 一样。这是一个示例: which(colnames(df) == var) 不起作用,我尝试了 which(colnames(df) == !!var) 但它仍然不起作用。它需要被视为 which(colnames(df)) == "var")。如何管理?
    • 我认为是因为colnames()函数返回一个字符向量。
    猜你喜欢
    • 2020-01-02
    • 2022-01-20
    • 1970-01-01
    • 2014-10-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多