我有一个数据框,需要按列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
基本上:我正在尝试为此数据框编写一个函数,该函数使我可以通过传递作为参数传递的任何列来聚合整数列。我不明白为什么会出现此错误。
答案 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)