问题
Consider the below code :
library(h2o)
library(plyr)
h2o.init()
data1x <- "x row1
1 1
1 2
1 3
1 4
2 1
2 2
2 3
3 1
4 2"
data1x <- read.table(textConnection(data1x), header=TRUE)
data1xH2O <- as.h2o(data1x)
fun = function(df) {
1:2
}
h2o.ddply(data1xH2O, "x", fun)
ddply(data1x, "x", fun)
The h20 version of ddply gives below error.
ERROR: Unexpected HTTP Status code: 400 Bad Request (url = http://localhost:54321/99/Rapids)
water.rapids.Rapids.IllegalASTException
[1] "water.rapids.Rapids$IllegalASTException: Missing a number"
[2] " water.rapids.Rapids.number(Rapids.java:312)"
[3] " water.rapids.Rapids.parseNumList(Rapids.java:243)"
[4] " water.rapids.Rapids.parseList(Rapids.java:208)"
[5] " water.rapids.Rapids.parseNext(Rapids.java:140)"
[6] " water.rapids.Rapids.parseFunctionDefinition(Rapids.java:193)"
[7] " water.rapids.Rapids.parseNext(Rapids.java:139)"
[8] " water.rapids.Rapids.parseFunctionApplication(Rapids.java:158)"
[9] " water.rapids.Rapids.parseNext(Rapids.java:138)"
[10] " water.rapids.Rapids.parseFunctionApplication(Rapids.java:158)"
[11] " water.rapids.Rapids.parseNext(Rapids.java:138)"
[12] " water.rapids.Rapids.parse(Rapids.java:48)"
[13] " water.rapids.Rapids.exec(Rapids.java:81)"
[14] " water.api.RapidsHandler.exec(RapidsHandler.java:39)"
[15] " sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)"
[16] " sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)"
[17] " sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)"
[18] " java.lang.reflect.Method.invoke(Method.java:483)"
[19] " water.api.Handler.handle(Handler.java:61)"
[20] " water.api.RequestServer.serve(RequestServer.java:412)"
[21] " water.api.RequestServer.doGeneric(RequestServer.java:263)"
[22] " water.api.RequestServer.doPost(RequestServer.java:200)"
[23] " javax.servlet.http.HttpServlet.service(HttpServlet.java:755)"
[24] " javax.servlet.http.HttpServlet.service(HttpServlet.java:848)"
[25] " org.eclipse.jetty.servlet.ServletHolder.handle(ServletHolder.java:684)"
[26] " org.eclipse.jetty.servlet.ServletHandler.doHandle(ServletHandler.java:503)"
[27] " org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:137)"
[28] " org.eclipse.jetty.security.SecurityHandler.handle(SecurityHandler.java:557)"
[29] " org.eclipse.jetty.server.session.SessionHandler.doHandle(SessionHandler.java:231)"
[30] " org.eclipse.jetty.server.handler.ContextHandler.doHandle(ContextHandler.java:1086)"
[31] " org.eclipse.jetty.servlet.ServletHandler.doScope(ServletHandler.java:429)"
[32] " org.eclipse.jetty.server.session.SessionHandler.doScope(SessionHandler.java:193)"
[33] " org.eclipse.jetty.server.handler.ContextHandler.doScope(ContextHandler.java:1020)"
[34] " org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:135)"
[35] " org.eclipse.jetty.server.handler.HandlerCollection.handle(HandlerCollection.java:154)"
[36] " org.eclipse.jetty.server.handler.HandlerWrapper.handle(HandlerWrapper.java:116)"
[37] " org.eclipse.jetty.server.Server.handle(Server.java:370)"
[38] " org.eclipse.jetty.server.AbstractHttpConnection.handleRequest(AbstractHttpConnection.java:494)"
[39] " org.eclipse.jetty.server.BlockingHttpConnection.handleRequest(BlockingHttpConnection.java:53)"
[40] " org.eclipse.jetty.server.AbstractHttpConnection.content(AbstractHttpConnection.java:982)"
[41] " org.eclipse.jetty.server.AbstractHttpConnection$RequestHandler.content(AbstractHttpConnection.java:1043)"
[42] " org.eclipse.jetty.http.HttpParser.parseNext(HttpParser.java:865)"
[43] " org.eclipse.jetty.http.HttpParser.parseAvailable(HttpParser.java:240)"
[44] " org.eclipse.jetty.server.BlockingHttpConnection.handle(BlockingHttpConnection.java:72)"
[45] " org.eclipse.jetty.server.bio.SocketConnector$ConnectorEndPoint.run(SocketConnector.java:264)"
[46] " org.eclipse.jetty.util.thread.QueuedThreadPool.runJob(QueuedThreadPool.java:608)"
[47] " org.eclipse.jetty.util.thread.QueuedThreadPool$3.run(QueuedThreadPool.java:543)"
[48] " java.lang.Thread.run(Thread.java:745)"
Error in .h2o.doSafeREST(h2oRestApiVersion = h2oRestApiVersion, urlSuffix = page, :
ERROR MESSAGE:
Missing a number
The same code for ddply from plyr package works. Please give any suggestion.
回答1:
The problem is that your function does nothing with respect the dataframe and based on your function definition it is not clear what your objective is.
fun = function(df) { 1:2 }
if you look at h2o.ddply function documentation you will see that this function is used to apply a function on full data set based on certain criteria.
I have changed your above example as below to explain it better:
> data1xH2O
x row1
1 1 1
2 1 2
3 1 3
4 1 4
5 2 1
6 2 2
> fun1 = function(df) { df[,1]}
> h2o.ddply(data1xH2O, 1:2, fun1)
x row1 ddply_C1
1 1 1 1
2 1 2 1
3 1 3 1
4 1 4 1
5 2 1 2
6 2 2 2
Above the fun1 is extracting our column out from passed dataframe. Again if I change the fun to fun2 as below:
> fun2 = function(df) { df[,2]}
> h2o.ddply(data1xH2O, 1:2, fun2)
x row1 ddply_C1
1 1 1 1
2 1 2 2
3 1 3 3
4 1 4 4
5 2 1 1
6 2 2 2
来源:https://stackoverflow.com/questions/41821274/how-to-use-function-in-h2o-ddply-r