将函数列表传递给 R 中的 ddply
Passing a list of functions to ddply in R
我希望能够将函数列表应用到 ddply,以便列表可以根据我的需要进行扩展。
像这样:
func_list = list(Start.Date = "min(Date)", End.Date = "max(Date)")
do.call(ddply, c(list(.data = df, .variables = grps, .fun=summarize), func_list))
当我 运行 时,它调用 ddply 但随后有一个名为 Start.Date 的变量等于字符串 "min(Date)"。我试过不引用,但也没用。
编辑(示例代码和期望的结果):
library(plyr)
get_summary <- function(grps, func_list, df = raw) {
out <- do.call(ddply,
c(list(.data = df, .variables = grps, .fun=summarize),
func_list))
return(out)
}
raw <- data.frame(date = c(as.Date("2015-5-1"),
as.Date("2015-5-1"),
as.Date("2015-5-2"),
as.Date("2015-5-2")),
count = c(2,4,6,8),
amnt = c(100,200,300,400))
func_list <- list(
total_count = "sum(count)",
avg_amnt = "mean(amnt)"
)
get_summary("date", func_list)
# Desired output:
# date total_count avg_amnt
# 1 2015-05-01 6 150
# 2 2015-05-02 14 350
#
# Which is equivalent to:
# ddply(raw, "date", summarize, total_count = sum(count), avg_amnt = mean(amnt))
要修复您的代码,您只需要 parse()
:
func_list <- list(
total_count = parse(text="sum(count)"),
avg_amnt = parse(text="mean(amnt)"))
这将告诉解释器文本应该被评估为代码而不是字符串。
我希望能够将函数列表应用到 ddply,以便列表可以根据我的需要进行扩展。
像这样:
func_list = list(Start.Date = "min(Date)", End.Date = "max(Date)")
do.call(ddply, c(list(.data = df, .variables = grps, .fun=summarize), func_list))
当我 运行 时,它调用 ddply 但随后有一个名为 Start.Date 的变量等于字符串 "min(Date)"。我试过不引用,但也没用。
编辑(示例代码和期望的结果):
library(plyr)
get_summary <- function(grps, func_list, df = raw) {
out <- do.call(ddply,
c(list(.data = df, .variables = grps, .fun=summarize),
func_list))
return(out)
}
raw <- data.frame(date = c(as.Date("2015-5-1"),
as.Date("2015-5-1"),
as.Date("2015-5-2"),
as.Date("2015-5-2")),
count = c(2,4,6,8),
amnt = c(100,200,300,400))
func_list <- list(
total_count = "sum(count)",
avg_amnt = "mean(amnt)"
)
get_summary("date", func_list)
# Desired output:
# date total_count avg_amnt
# 1 2015-05-01 6 150
# 2 2015-05-02 14 350
#
# Which is equivalent to:
# ddply(raw, "date", summarize, total_count = sum(count), avg_amnt = mean(amnt))
要修复您的代码,您只需要 parse()
:
func_list <- list(
total_count = parse(text="sum(count)"),
avg_amnt = parse(text="mean(amnt)"))
这将告诉解释器文本应该被评估为代码而不是字符串。