我希望将用户输入变量传递给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
输出低于
在我正在开发的应用程序中,数据框以及列名称将由用户定义。我将读取.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文件中,我可以捕获每个变量所需的汇总类型。
感谢您的任何建议。