gpt4 book ai didi

java - 使用 Renjin 将 POJO 对象的 ArrayList 转换为 R 数据框

转载 作者:行者123 更新时间:2023-11-30 03:15:36 26 4
gpt4 key购买 nike

我正在尝试使用 Renjin从 Java 程序中存在的数据构建模型。我有一个ArrayList POJO 对象列表,其中每个属性都是 String ,一个double ,或 int 。如果我打电话toString()记录如下所示:

Record{id='uibbd923e5929b43', countryCode='FR', revenue=3.14159, count=1}
Record{id='uicdd967e5942b55', countryCode='GB', revenue=0.07, count=49}
...

我实例化了 R,在 JVM 中运行,如下所示:

ScriptEngineManager manager = new ScriptEngineManager();
ScriptEngine engine = manager.getEngineByName("Renjin");

...然后输入 ArrayList R 中的记录数:

engine.put("records", records);

在 R 内部,记录存储为 <externalptr> 的列表。对象。可以看到存储在指针内的值的字符串表示形式,例如

engine.eval("print(data.frame(lapply(records, as.character), stringsAsFactors=FALSE))");

但是,我真的希望将它们存储为具有正确数据类型的数据帧,而不是可以视为字符串的外部指针列表。

如何转换externalptr的列表到数据框?

更新:

这是我蹩脚的解决方法,至少目前是这样。将数据写入 CSV:

CSVWriter writer = new CSVWriter(new FileWriter("tmp/output.csv"), '\t');    
writer.writeNext(new String[] {"id", "countryCode", "revenue", "count"});

for (Record record : records){

writer.writeNext(new String[]{record.getId(),
record.getCountryCode(),
record.getRevenue().toString(),
record.getCount().toString()});
}

writer.close();

然后让 Renjin 将 CSV 读取到数据框中:

engine.eval("df <- read.table(\"tmp/output.csv\", header = TRUE)");

更新:

现在,我决定使用 Rserve相反,因为它提供了更多的灵 active 。 Rserve(相对于 Renjin)的一个缺点是我们现在需要确保 R 正在运行并安装了必要的软件包。

最佳答案

将其作为一个小帮助程序库组合在一起可能会很有用,但目前,您可以通过以下方式在 Java 中逐步“手动”构造 data.frame:

StringArrayVector.Builder id = new StringArrayVector.Builder();
StringArrayVector.Builder country = new StringArrayVector.Builder();
DoubleArrayVector.Builder revenue = new DoubleArrayVector.Builder();
for(Record record : records) {
id.add(record.getId());
country.add(record.getCountry());
revenue.add(record.getRevenue());
}

ListVector.NamedBuilder myDf = new ListVector.NamedBuilder();
myDf.setAttribute(Symbols.CLASS, StringVector.valueOf("data.frame"));
myDf.setAttribute(Symbols.ROW_NAMES, new RowNamesVector(records.size());
myDf.add("id", id.build());
myDf.add("country", country.build());
myDf.add("revenue", revenue.build());

从上面可以看出,data.frame 对象实际上只是一个列列表,因此需要进行一些操作才能将 Java Bean 集合(本质上是基于行的格式)转换为列的集合。

添加“row.names”属性也很重要,nrow() 等函数使用该属性来获取 data.frame 对象的尺寸。

上面的 RowNamesVector 是 StringVector 的专门实现,它根据需要计算 row.names“1”、“2”、“3”等,而不为所有字符串分配内存。

关于java - 使用 Renjin 将 POJO 对象的 ArrayList 转换为 R 数据框,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32728099/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com