[英]Passing argument into function for group_by in dplyr
我正在尝试在 dplyr (R) 的函数调用中使用 group_by,但我得到了意想不到的结果。 这是我正在尝试做的一个例子:
df = data.frame(a = c(0,0,1,1), b = c(0,1,0,1), c = c(1,2,3,4))
result1 = df %>%
group_by(a,b) %>%
mutate(d = sum(c))
result1$d
myFunc <- function(df, var) {
output = df %>%
group_by(a,!!var) %>%
mutate(d = sum(c))
return(output)
}
result2 = myFunc(df,"b")
result2$d
result1$d 产生 [1,2,3,4] 这是我所期望的。 result2$d 产生我不想要的 [3,3,7,7] ,我不确定发生了什么。
它可以将 b(不带引号)作为函数参数,并用 {{var}} 代替 !!var。 不幸的是,在我的情况下,我的列名是字符串格式(但也许有一种方法可以预先转换字符串,以便它可以使用 {{}} 表示法?)
如果你想传递一个可以引用数据框某一列的字符对象,你应该使用!!sym(var)
:
myFunc <- function(df, var) {
output = df %>%
group_by(a, !!sym(var)) %>%
mutate(d = sum(c))
return(output)
}
myFunc(df, "b")
如果你想传递一个数据屏蔽参数,你应该使用{{ var }}
或等效!!enquo(var)
:
myFunc <- function(df, var) {
output = df %>%
group_by(a, {{ var }}) %>%
mutate(d = sum(c))
return(output)
}
myFunc(df, b)
请注意,在两种不同的情况下,我分别将"b"
和b
传递给函数。
如果我们想使用引用和取消引用而不是 curlycurly {{}}
,我们应该考虑这个基本过程: https ://tidyeval.tidyverse.org/dplyr.html
围绕 dplyr 管道创建函数涉及三个步骤:抽象、引用和取消引用。
1. 抽象步骤:
var
在group_by
:2.报价步骤:
enquo()
应用于这些参数3. 取消报价步骤:
!!
取消引用 .var
传递给group_by()
:myFunc <- function(df, var) {
var <- enquo(var)
output = df %>%
group_by(a,!!var) %>%
mutate(d = sum(c))
return(output)
}
result2 = myFunc(df,b)
输出:
[1] 1 2 3 4
就像我发布一个问题一样,我遇到了一些有用的东西......
myFunc <- function(df, var) {
output = df %>%
group_by_at(.vars = c("a",var)) %>%
mutate(d = sum(c))
return(output)
}
result2 = myFunc(df,"b")
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.