【问题标题】:How to pass a column argument in a dplyr function in select? [duplicate]如何在选择中的 dplyr 函数中传递列参数? [复制]
【发布时间】:2019-05-29 15:30:41
【问题描述】:

我有一个需要由 B 列汇总到一个数据框中的数据框。我还需要按 A 列将此数据框汇总到另一个数据框中。出于上下文的考虑,B 列是层次结构中 A 列的子列。我也只需要列 C:E,所以我认为 dplyr 是最有帮助的。

A  |  B  |  C  |  D  |  E  |  F |  G
-------------------------------------
1    1A     3     4     5     3    2
1    1B     4     4     4     4    3
2    2A     2     2     2     2    2
...

我的团队认为函数将是编写此代码的最有效方式,以实现更简洁的代码。如果我想按 A 列总结数据框,我知道我会将脚本编写成这样的:

df %>%
select(A, C, D, E) %>%
group_by(A) %>%
summarise(C = sum(C), D = sum(D), E = sum(E)

和B这样的:

df %>%
select(B, C, D, E) %>%
group_by(B) %>%
summarise(C = sum(C), D = sum(D), E = sum(E)

我正在努力将其转换为适用于任何一种情况的功能。这是我目前所拥有的:

slicedata <- function(df, column_name){

df %>%
select(column_name, C, D, E) %>%
group_by(column_name) %>%
summarise(C = sum(C), D = sum(D), E = sum(E)

}

但是当我在该函数中将 B 列作为参数传递时,这就是我得到的:

slicedata(df, B)
Error in .f(.x[[i]], ...) : object 'B' not found 

基本上:我正在尝试为此数据帧编写一个函数,该函数允许我按我作为参数传递的任何列聚合整数列。但是,我不明白为什么会出现此错误。

【问题讨论】:

    标签: r


    【解决方案1】:

    我们可以使用enquo将其转换为quosure,然后使用!!进行评估

    slicedata <- function(df, column_name){
      column_name = enquo(column_name)
      df %>%
        select(!!column_name, C, D, E) %>%
        group_by(!!column_name) %>%
        summarise(C = sum(C), D = sum(D), E = sum(E)
    
      }
    
    slicedata(df, B)
    

    【讨论】:

    • 谢谢!这很有帮助。我并不完全熟悉 R 的技术细节……“!!”是什么意思?做什么?
    • @AENick 在 tidyverse 上下文中,它评估 quosure
    猜你喜欢
    • 2020-06-25
    • 2015-03-29
    • 1970-01-01
    • 2019-11-28
    • 2015-03-14
    • 1970-01-01
    • 1970-01-01
    • 2014-09-08
    相关资源
    最近更新 更多