使用dplyr汇总多个列的不同操作

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了使用dplyr汇总多个列的不同操作相关的知识,希望对你有一定的参考价值。

好吧,我知道已经有很多相关问题,但没有一个能回答我的特殊需要。

我想在50列的表上使用dplyr“summarize”,我需要对这些列应用不同的汇总函数。

“Summarize_all”和“summarize_at”似乎都有缺点,即不可能将不同的函数应用于不同的变量子组。

举个例子,我们假设虹膜数据集有50列,所以我们不希望按名称来寻址列。我希望前两列的总和,第三列的平均值和所有剩余列的第一个值(在group_by(Species)之后)。我怎么能这样做?

答案

正如其他人所提到的,这通常是通过为要应用汇总函数的每组列调用summarize_each / summarize_at / summarize_if来完成的。据我所知,您必须创建一个自定义函数,对每个子集执行汇总。例如,您可以设置类名,以便您可以使用选择帮助程序(例如contains())仅过滤要应用该函数的列。如果没有,则可以设置要汇总的特定列号。

对于您提到的示例,您可以尝试以下操作:

summarizer <- function(tb, colsone, colstwo, colsthree, 
                       funsone, funstwo, funsthree, group_name) {

return(bind_cols(
    summarize_all(select(tb, colsone), .funs = funsone),
    summarize_all(select(tb, colstwo), .funs = funstwo) %>% 
      ungroup() %>% select(-matches(group_name)),
    summarize_all(select(tb, colsthree), .funs = funsthree) %>% 
      ungroup() %>% select(-matches(group_name)) 
))

}

#With colnames
iris %>% as.tibble() %>% 
  group_by(Species) %>% 
  summarizer(colsone = contains("Sepal"), 
         colstwo = matches("Petal.Length"), 
         colsthree = c(-contains("Sepal"), -matches("Petal.Length")),
         funsone = "sum", 
         funstwo = "mean",
         funsthree = "first",
         group_name = "Species")

#With indexes
iris %>% as.tibble() %>% 
 group_by(Species) %>% 
 summarizer(colsone = 1:2, 
         colstwo = 3, 
         colsthree = 4,
         funsone = "sum", 
         funstwo = "mean",
         funsthree = "first",
         group_name = "Species")
另一答案

您可以分别使用每个函数汇总数据,然后在需要时加入数据。

对于虹膜示例,这样的事情是这样的:

sums <- iris %>% group_by(Species) %>% summarise_at(1:2, sum)
means <- iris %>% group_by(Species) %>% summarise_at(3, mean)
firsts <- iris %>% group_by(Species) %>% summarise_at(4, first)
full_join(sums, means) %>% full_join(firsts)

虽然如果您需要使用多个汇总函数,我会尝试考虑其他内容。

另一答案

试试这个:

library(plyr)
library(dplyr)

dataframe <- data.frame(var = c(1,1,1,2,2,2),var2 = c(10,9,8,7,6,5),var3=c(2,3,4,5,6,7),var4=c(5,5,3,2,4,2))
dataframe

#  var var2 var3 var4
#1   1   10    2    5
#2   1    9    3    5
#3   1    8    4    3
#4   2    7    5    2
#5   2    6    6    4
#6   2    5    7    2

funnames<-c(sum,mean,first)
colnums<-c(2,3,4)
ddply(.data = dataframe,.variables = "var",
    function(x,funcs,inds){
        mapply(function(func,ind){
            func(x[,ind])
        },funcs,inds)
    },funnames,colnums)

#  var V1 V2 V3
#1   1 27  3  5
#2   2 18  6  2

以上是关于使用dplyr汇总多个列的不同操作的主要内容,如果未能解决你的问题,请参考以下文章

R:dplyr 有条件地汇总并重新编码列中的值

R:dplyr条件汇总并按列重新编码值

在 Redshift dplyr 操作中重命名汇总列

具有多个订单列的 dplyr row_number

使用dplyr汇总并保持相同的变量名称

自定义函数与dplyr变异或汇总因子中的不同级别?