如何在select的dplyr函数中传递列参数?

时间:2019-05-29 15:30:41

标签: r

我有一个数据框,需要按列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 

基本上:我正在尝试为此数据框编写一个函数,该函数使我可以通过传递作为参数传递的任何列来聚合整数列。我不明白为什么会出现此错误。

1 个答案:

答案 0 :(得分:2)

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

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)