我在函数调用中有一个复杂的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)
我首选的解决方案类似于group_by
只是忽略了缺失的列,并且在p
工作时只会按df2
进行分组。
答案 0 :(得分:4)
我们可以使用intersect
avgP1 <- function(df){
df %>%
group_by_(.dots = intersect(names(df), c("s", "p"))) %>%
summarise(avg=mean(v))
}
avgP1(df1)
avgP1(df2)