使用HDF5将Julia数据框保存以便在R中读取

4

虽然在Julia中读取R数据集已经得到了足够的关注,但有时需要将Julia中进行的计算结果可读性高地转换为R。为了实现这一点,我尝试将DataFrame.jl对象保存在HDF5文件中。以下是迄今为止的代码,符合当前可用的HDF5.jl方法的限制:

using DataFrames, HDF5
df = DataFrame(coln1 = 1:4, coln2 = ["M", "F", "F", "M"], coln3 = int8([1, 0, 1, 1]))
h5open("trydf.h5", "w") do file
  g = g_create(file, "df") # create a group
  for cnm in DataFrames._names(df)
    g["$cnm"] = convert(Array, df[cnm])
  end
  attrs(g)["Description"] = "Julia DataFrame columns"
end

数据框可以使用rhdf5包工具在R中重新组装。 有更优雅的方法来完成这个任务吗?是否有不需要将数据框拆分并在R中重新组装的方法,从而丢失某些列类型(例如,布尔值无法正常工作)?

您是否愿意考虑保存到除hdf5之外的其他格式?如果数据集不是很大且Julia数据尚未转换为数据框,则将其保存为CSV文件可能是有意义的。 - Mike Satteson
CSV确实是一个在有中等大小数据框时合理的选择。然而,HDF5的吸引力在于其可以包含比我的最小例子中更复杂的对象的分层结构的可能性,并且在Julia和R之间进行交换时能够保留一些对象结构会很有帮助。 - Pavel
1个回答

3
当我被指向RCall.jl包时,列类型限制问题得到了解决。该软件包对于集成Julia和R工作非常有帮助。在这个例子中,我们可以创建本地的RData文件,而不是保存HDF5文件:
using DataFrames
using RCall

# example DataFrame
df = DataFrame(coln1 = 1:4, coln2 = ["M", "F", "F", "M"], coln3 = [false, true, false, true], coln4 = int8([1, 0, 1, 1]))

# R environment in a session started from Julia
g = globalEnv
reval(rparse("dfls <- NULL"))

# add columns one at a time converting Julia vectors to R-types via   RCall.sexp
#  https://github.com/JuliaStats/RCall.jl/blob/master/src/sexp.jl
for cnm in DataFrames._names(df)
  g[:colcnm] = sexp(convert(Array, df[cnm]))
  reval(rparse("dfls\$$cnm <- colcnm"))
end
reval(rparse("df <- data.frame(dfls)"))
reval(rparse("save(file='dfjulia.RData', df)"))

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接