我dplyr在函数调用中有一个复杂的结构。输入是一个数据帧,可以有一个称为的额外列s。如果此列可用,除了标准分组外,我还要按此列分组。目前,我通过if检查该列是否在数据框中的语句来解决该问题,并使分组方式有所不同。分组后,两种数据的代码相同。
有没有更优雅的方式做到这一点?在我的原始函数中,我在summarise函数中计算了几个变量,并且我不想分别维护这两个部分。
这是一个例子。
library(dplyr)
df1 <- data.frame(s=rep(c('a','b'), each=10),
p=rep(letters[1:5], 4),
v=runif(20))
df2 <- data.frame(p=rep(letters[1:5], each=4),
v=runif(20))
avgP <- function(df) {
if('s' %in% names(df)) {
df %>%
group_by(s, p) %>%
summarise(avg=mean(v))
} else {
df %>%
group_by(p) %>%
summarise(avg=mean(v))
}
}
avgP(df1)
avgP(df2)
Run Code Online (Sandbox Code Playgroud)
我更喜欢的解决方案group_by是,仅忽略缺少的列,仅p在进行工作时按进行分组df2。
我们可以用 intersect
avgP1 <- function(df){
df %>%
group_by_(.dots = intersect(names(df), c("s", "p"))) %>%
summarise(avg=mean(v))
}
avgP1(df1)
avgP1(df2)
Run Code Online (Sandbox Code Playgroud)