【问题标题】:Calling h2o.group_by with dynamic arguments使用动态参数调用 h2o.group_by
【发布时间】:2018-03-29 10:20:10
【问题描述】:

我有一个关于在 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 以产生预期结果的任何建议?

卡提克

【问题讨论】:

  • quote=TRUE 给出相同的结果?
  • 如果我使用 quote=TRUE 而不是 quote=FALSE,我会收到以下错误: agg[[2]] 中的错误:下标超出范围

标签: r h2o do.call


【解决方案1】:

如果我正确理解了您的问题,我认为您正在寻找类似于以下代码的内容。这是否满足您的需求?

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")

【讨论】:

  • 这绝对满足我的需求!我以前从未明确使用过 call() 函数。谢谢。
猜你喜欢
  • 1970-01-01
  • 2018-03-06
  • 2010-10-15
  • 1970-01-01
  • 2012-10-15
  • 2019-11-03
  • 2015-07-13
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多