在summarize()

时间:2018-03-19 19:50:07

标签: r group-by dplyr summarize

我希望将用户输入变量传递给group_by()和summarize()函数。

数据框和代码的直接示例如下。在这里,我对列名进行了“硬编码”。

library(dplyr)
df <- data.frame('Category' = c('a','c','a','a','b','a','b','b'), 
             'Amt' = c(100,300,200,400,500,1000,350,250), 
             'Flag' = c(0,1,1,1,0,1,1,0))
rowCount <- nrow(df)
totalAmt <- sum(df$Amt)
g <- group_by(df, Category)
summ <- summarize(g, Count = n(), CountPercentage = n()*100/rowCount, TotalAmt = sum(Amt), AmtPercentage = sum(Amt)*100/totalAmt, FlagSum = sum(Flag))
summ

输出低于

enter image description here

在我正在开发的应用程序中,数据框以及列名称将由用户定义。我将读取.csv文件名,要分组的列以及要从Excel文件汇总的列。

我已经进行了广泛的搜索,在花了很多时间阅读和试验后,我发现下面显示的解决方案对我有用。我没有使用滚边来使步骤更清晰。

#The data frame df is read from the .csv file name
#Variables read from the Excel file
groupby <- 'Category'
sumBy1 <- 'Amt'
sumBy2 <- 'Flag'

rowCount <- nrow(df)
totalAmt <- sum(df[sumBy1])

g <- group_by_(df, groupby) #group by variable  #grouping

summcount <- summarize(g, Count = n(), CountPercentage = n()*100/rowCount) #summarize counts  #piece 1

summamt <- summarize_at(g, .vars = sumBy1, .funs=sum) #summarize by first variable
summamt <- summamt[-1] #remove first column to remove duplicate column
summamt$AmtPercentage <- summamt[sumBy1]*100/totalAmt  #piece 2

summflag <- summarize_at(g, .vars = sumBy2, .funs=sum) #summarize by second variable
summflag <- summflag[-1] #remove first column to remove duplicate column #piece 3

summ <- cbind(summcount, summamt, summflag)  #combine dataframes
summ

结果与上述相同。正如您所看到的,我正在创建最终的数据帧,然后绑定它们。代码很难看。另外,如何在此语法中定义列标题?我确实考虑过summarize_all(),但这需要创建数据框的子集。我已经阅读了以下问题但它们对我不起作用

Passing arguments to dplyr summarize function

Summarizing data in table by group for each variable in r

你能推荐一种更简单,更优雅的方法吗?

上面我有'硬编码'两种类型的摘要,即:数和总和。要增加另一级别的复杂性,如果用户还要定义所需的摘要类型(即总和,平均值,计数等),该怎么办?在Excel文件中,我可以捕获每个变量所需的汇总类型。

感谢您的任何建议。

0 个答案:

没有答案