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>给了我更多的可能性。再次感谢!