如何将动态列名传递给h2o排列函数

时间:2018-04-30 02:43:28

标签: r h2o

给定带有数字列col的h2o数据框df,如果专门定义了列,则df by col的种类会起作用:

h2o.arrange(df, "col")

但是当我传递动态变量名时,排序并不起作用:

var <- "A"
h2o.arrange(df, var)

我不想对列名进行硬编码。有什么办法可以解决吗?感谢。

根据Darren的要求添加了一个例子

library(h2o)
h2o.init()

df <- as.h2o(cars)

var <- "dist"

h2o.arrange(df, var) # got error

h2o.arrange(df, "dist") # works

1 个答案:

答案 0 :(得分:1)

事实证明这很棘手,但是您可以使用call()获取要评估的动态列名称。因此,从您的示例继续:

var <- "dist"
eval(call("h2o.arrange",df,var))

礼物:

  speed dist
1     4    2
2     7    4
3     4   10
4     9   10

然后:

var <- "speed"
eval(call("h2o.arrange",df,var))

礼物:

  speed dist
1     4    2
2     4   10
3     7    4
4     7   22

(我很想说这是我想到的第一件事,但它更像是实验编号54!我快到一半了http://adv-r.had.co.nz/Expressions.html,也许还有其他更好的方法可以实现相同的目标东西。)

另外,获得相同结果的另一种方法是:

var = 1
h2o:::.newExpr("sort", df, var)

var = 0
h2o:::.newExpr("sort", df, var)

分别。即第三个参数是列的从零开始的索引。您可以使用match(var, names(df)) - 1来获得 that 。至此,您已经实现了h2o.arrange()的75%。

(请记住,每次您最终使用h2o:::时,都有冒着在将来的H2O版本中无法使用的风险。)