dplyr中缺少列的分组

dplyr中缺少列的分组,r,dplyr,R,Dplyr,我在函数调用中有一个复杂的dplyr结构。输入是一个数据帧,它可以有一个额外的列,名为s。如果此列可用,我希望在标准分组的基础上按此列进行分组。 目前,我通过一个if语句来解决这个问题,该语句检查列是否在数据帧中,并以不同的方式进行分组。分组后,这两种数据的代码相同 有没有更优雅的方法?在我的原始函数中,我在summary函数中计算了几个变量,我不想分别维护这两个部分 这里有一个例子 library(dplyr) df1 <- data.frame(s=rep(c('a','b'), ea

我在函数调用中有一个复杂的
dplyr
结构。输入是一个数据帧,它可以有一个额外的列,名为
s
。如果此列可用,我希望在标准分组的基础上按此列进行分组。 目前,我通过一个
if
语句来解决这个问题,该语句检查列是否在数据帧中,并以不同的方式进行分组。分组后,这两种数据的代码相同

有没有更优雅的方法?在我的原始函数中,我在
summary
函数中计算了几个变量,我不想分别维护这两个部分

这里有一个例子

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)
库(dplyr)
df1%
分组依据(p)%>%
总结(平均值=平均值(v))
}
}
avgP(df1)
avgP(df2)

我的首选解决方案是这样的:
groupby
只是忽略缺少的列,当我处理
df2
时,只按
p
分组。我们可以使用
intersect

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

avgP1(df1)
avgP1(df2)
avgP1%
分组(点=相交(名称(df),c(“s”,“p”))%>%
总结(平均值=平均值(v))
}
avgP1(df1)
avgP1(df2)

我们可以使用
intersect

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

avgP1(df1)
avgP1(df2)
avgP1%
分组(点=相交(名称(df),c(“s”,“p”))%>%
总结(平均值=平均值(v))
}
avgP1(df1)
avgP1(df2)

每个数据集中的变量是否相同?(当然除了
s
之外)?也许用SEW你说的SE是什么意思?是的,它们基本上是一样的。。另外@akrun的答案在每个数据集中使用相同的变量?(当然除了
s
之外)?也许用SEW你说的SE是什么意思?是的,它们基本上是一样的。。@akrun的答案也使用了SEWow,这是一个非常好的解决方案。如果分组列完全不存在,我可以以类似的方式使用它吗?分组还是不分组。。。也就是说:-)@drmariod在当前设置中,如果没有“s”或“p”列,它将给出整个“v”的平均值,即
df3这是完美的。我没有意识到所有这些
\uuu
函数,我只是认为它们有助于解决命名冲突。。。在我最初的函数中,我还使用了
tidyr::gather
,现在切换到
tidyr::gather\ucode>给了我更多的可能性。再次感谢!哇,这是一个非常好的解决方案。如果分组列完全不存在,我可以以类似的方式使用它吗?分组还是不分组。。。也就是说:-)@drmariod在当前设置中,如果没有“s”或“p”列,它将给出整个“v”的平均值,即
df3这是完美的。我没有意识到所有这些
\uuu
函数,我只是认为它们有助于解决命名冲突。。。在我最初的函数中,我还使用了
tidyr::gather
,现在切换到
tidyr::gather\ucode>给了我更多的可能性。再次感谢!