将多个参数传递给ddply

时间:2017-12-27 03:30:01

标签: r dplyr nse

我正在尝试创建一个以列表作为输入的函数,并返回一个汇总数据框。但是,在尝试多种方式后,我无法将列表传递给聚合函数。

到目前为止,我有以下内容,但它失败了。

library(dplyr)

random_df <- data.frame(
  region = c("A", "B", "C", "C"),
  number_of_reports = c(1, 3, 2, 1),
  report_MV = c(12, 33, 22, 12)
)

output_graph <- function(input) {
    print(input$arguments)
    DF <- input$DF
    group_by <- input$group_by
    args <- input$arguments
    flow <- ddply(DF, group_by, summarize, args)
    return(flow)
}

graph_functions <- list(
    DF = random_df,
    group_by = .(region),
    arguments = .(Reports = sum(number_of_reports),
                  MV_Reports = sum(report_MV))
)

output_graph(graph_functions)

这有效:

library(dplyr)

random_df <- data.frame(
  region = c("A", "B", "C", "C"),
  number_of_reports = c(1, 3, 2, 1),
  report_MV = c(12, 33, 22, 12)
)

output_graph <- function(input) {
    print(input$arguments)
    DF <- input$DF
    group_by <- input$group_by
    args <- input$arguments
    flow <- ddply(
      DF,
      group_by, 
      summarize,
      Reports = sum(number_of_reports),
      MV_Reports = sum(report_MV)
    )
    return(flow)
}

graph_functions <- list(
  DF = random_df,
  group_by = .(region),
  arguments = .(Reports = sum(number_of_reports),
                MV_Reports = sum(report_MV))
)

output_graph(graph_functions)

有人会意识到将函数列表传递给ddply的方法吗?或者另一种实现聚合动态变量集的目标的方法。

1 个答案:

答案 0 :(得分:1)

为了将参数传递给函数以供dplyr使用,我建议阅读有关非标准评估(NSE)的this。这是一个编辑过的函数,它产生与原始函数相同的输出。

library(dplyr)

random_df <- data.frame(
  region = c('A','B','C','C'),
  number_of_reports = c(1, 3, 2, 1),
  report_MV = c(12, 33, 22, 12)
)

output_graph <- function(df, group, args) {

  grp_quo <- enquo(group)

  df %>%
    group_by(!!grp_quo) %>%
    summarise(!!!args)

}

args <- list(
  Reports = quo(sum(number_of_reports)),
  MV_Reports = quo(sum(report_MV))
)

output_graph(random_df, region, args)

# # A tibble: 3 x 3
#   region Reports MV_Reports
#   <fctr>   <dbl>      <dbl>
# 1 A         1.00       12.0
# 2 B         3.00       33.0
# 3 C         3.00       34.0