[英]How to get data.frame in Java using Rserve
我在我的项目中使用Twitter异常检测算法 。 为此,我使用Rserve库在我的Java应用程序中运行R代码。
我的Java代码:
RConnection connection = new RConnection();
connection.voidEval("library(AnomalyDetection)");
connection.eval("res <- AnomalyDetectionTs(data.frame(/*list of timestamps*/,/*list of values*/), direction='both', plot=FALSE, longterm=TRUE)");
结果,我得到了这个输出:
$anoms
timestamp anoms
1 1980-09-25 16:05:00 21.3510
2 1980-09-29 06:40:00 193.1036
3 1980-09-29 21:44:00 148.1740
为了获得结果,我现在使用这个不太好的解决方案: connection.eval("write.csv(res[['anoms']],file='anom.csv')");
然后我用Java打开这个文件并解析结果。
那么,如何使用Rserve对data.frame结构的可能性来获得Java的输出结果呢?
只需编写R命令,使其将所需结果返回给Java:
RList l = c.eval("AnomalyDetectionTs(data, direction='both',
plot=FALSE, longterm=TRUE)$anoms").asList();
你得到的是具有timestamp
和anoms
两个变量的数据框(作为列表)。
但是, AnomalyDetectionTs
以一种非常恼人和低效的格式返回日期,因此您可能希望实际返回更易于使用Java的更合理的结果,例如:
RList l = c.eval("{ res <- AnomalyDetectionTs(data, direction='both', plot=FALSE,
longterm=TRUE)$anoms;
list(as.POSIXct(res$timestamp), res$anoms) }").asList();
double ts[] = l.at(0).asDoubles();
double anom[] = l.at(1).asDoubles();
for (int i = 0; i < ts.length; i++)
System.out.println(new java.util.Date((long)(ts[i]*1000.0)) + ": " + anom[i]);
PS:Rserve问题的正确位置是stats-rosuda-devel邮件列表 ,它可以更快地为您提供答案。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.