在dplyr中分组,缺少列

时间:2017-03-03 10:28:43

标签: 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)

我首选的解决方案类似于group_by只是忽略了缺失的列,并且在p工作时只会按df2进行分组。

1 个答案:

答案 0 :(得分:4)

我们可以使用intersect

avgP1 <- function(df){
  df %>% 
  group_by_(.dots =  intersect(names(df), c("s", "p"))) %>% 
  summarise(avg=mean(v))
 }

avgP1(df1)
avgP1(df2)