使用动态参数调用 h2o.group_by
Calling h2o.group_by with dynamic arguments
我有一个关于在 H2O 的 group_by() 函数上使用 do.call() 的问题。
考虑以下示例:
library(h2o)
h2o.init()
# Import the airlines data set and display a summary.
airlinesURL <- "https://s3.amazonaws.com/h2o-airlines-unpacked/allyears2k.csv"
airlines.hex <- h2o.importFile(path = airlinesURL,
destination_frame = "airlines.hex")
h2o.group_by(data = airlines.hex,
by="Origin",
nrow("Origin"),
min("Origin"),
max("Origin"),
gb.control=list(na.methods="rm"))
输出如下图:
Origin nrow min_Origin max_Origin
1 ABE 59 0 0
2 ABQ 876 1 1
3 ACY 31 2 2
4 ALB 75 3 3
5 AMA 11 4 4
6 ANC 1 5 5
现在,我想使用 do.call() 函数来调用 h2o.group_by(),而不是上面直接调用 h2o.group_by()。原因是我想动态构建要汇总的字段列表(即 nrow("Origin")、max("Origin") 等)。
所以,我尝试了这个(以及以下代码的许多变体):
do.call(h2o.group_by, list(data=airlines.hex,
by="Origin",
nrow("Origin"),
min("Origin"),
max("Origin"),
gb.control=list(na.methods="rm")),
quote=FALSE)
我收到一个错误:
Error in if (ag == "sd") ag <- "\"sdev\"" : argument is of length zero
有人知道如何让 do.call() 函数在这种情况下工作吗?基本上,我需要能够使用动态生成的要汇总的字段集调用 h2o.group_by()。
在最坏的情况下,我相信我可以使用 eval 和 parse 来完成我需要的事情。换句话说:
eval(parse(text="
h2o.group_by(data = airlines.hex,
by=\"Origin\",
nrow(\"Origin\"),
min(\"Origin\"),
max(\"Origin\"),
gb.control=list(na.methods=\"rm\"))
"))
我想知道 do.call 可能是更好的使用方法。
关于如何使 do.call 产生预期结果的任何建议?
卡尔提克
如果我没有正确理解你的问题,我认为你正在寻找类似下面代码的东西。这是否满足您的需求?
airlinesGroupBy <- function(by)
{
do.call(h2o.group_by,
list(data = airlines.hex,
by = by,
call("nrow", by),
call("min", by),
call("max", by),
gb.control = list(na.methods = "rm")))
}
airlinesGroupBy("Origin")
我有一个关于在 H2O 的 group_by() 函数上使用 do.call() 的问题。
考虑以下示例:
library(h2o)
h2o.init()
# Import the airlines data set and display a summary.
airlinesURL <- "https://s3.amazonaws.com/h2o-airlines-unpacked/allyears2k.csv"
airlines.hex <- h2o.importFile(path = airlinesURL,
destination_frame = "airlines.hex")
h2o.group_by(data = airlines.hex,
by="Origin",
nrow("Origin"),
min("Origin"),
max("Origin"),
gb.control=list(na.methods="rm"))
输出如下图:
Origin nrow min_Origin max_Origin
1 ABE 59 0 0
2 ABQ 876 1 1
3 ACY 31 2 2
4 ALB 75 3 3
5 AMA 11 4 4
6 ANC 1 5 5
现在,我想使用 do.call() 函数来调用 h2o.group_by(),而不是上面直接调用 h2o.group_by()。原因是我想动态构建要汇总的字段列表(即 nrow("Origin")、max("Origin") 等)。
所以,我尝试了这个(以及以下代码的许多变体):
do.call(h2o.group_by, list(data=airlines.hex,
by="Origin",
nrow("Origin"),
min("Origin"),
max("Origin"),
gb.control=list(na.methods="rm")),
quote=FALSE)
我收到一个错误:
Error in if (ag == "sd") ag <- "\"sdev\"" : argument is of length zero
有人知道如何让 do.call() 函数在这种情况下工作吗?基本上,我需要能够使用动态生成的要汇总的字段集调用 h2o.group_by()。
在最坏的情况下,我相信我可以使用 eval 和 parse 来完成我需要的事情。换句话说:
eval(parse(text="
h2o.group_by(data = airlines.hex,
by=\"Origin\",
nrow(\"Origin\"),
min(\"Origin\"),
max(\"Origin\"),
gb.control=list(na.methods=\"rm\"))
"))
我想知道 do.call 可能是更好的使用方法。
关于如何使 do.call 产生预期结果的任何建议?
卡尔提克
如果我没有正确理解你的问题,我认为你正在寻找类似下面代码的东西。这是否满足您的需求?
airlinesGroupBy <- function(by)
{
do.call(h2o.group_by,
list(data = airlines.hex,
by = by,
call("nrow", by),
call("min", by),
call("max", by),
gb.control = list(na.methods = "rm")))
}
airlinesGroupBy("Origin")