在dplyr中分组,缺少列

drm*_*iod 1 r dplyr

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

akr*_*run 5

我们可以用 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)