2015-01-22 1 views
3

Julia에서 R 데이터 세트를 읽는 데 이미 충분한주의를 기울 였지만 Julia에서 수행 한 계산 결과는 R에서 읽을 수 있어야합니다. DataFrame.jl 개체를 저장하려고 시도한 결과 HDF5 파일.Julia 데이터 프레임을 HDF5를 사용하여 R로 읽을 수 있습니다.

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 

dataframe는 다음 rhdf5 패키지 도구를 사용하여 R에 재 조립 될 수있다 : 여기에 지금까지, 현재 HDF5.jl 방법의 제한 내에서 작성된 코드입니다. 이 작업을 수행하는 좀 더 우아한 방법이 있습니까? 데이터 프레임을 분리하고 R로 다시 어셈블 할 필요가 없는데, 길을 따라 일부 열 유형 (예 : 부울이 작동하지 않음)을 잃어 버리는 경우가 있습니까?

+0

hdf5 이외의 형식으로 저장하는 것이 좋습니다. 데이터 세트가 크지 않고 Julia 데이터가 데이터 프레임에없는 경우 CSV 파일과 같이 저장하는 것이 좋습니다. –

+0

CSV는 적당한 크기의 데이터 프레임을 가진 합리적인 선택입니다. 그러나 HDF5의 매력은 최소한의 예제보다 복잡한 객체를 포함하는 계층 적 구조의 가능성이며 Julia와 R 사이에서 교환 할 때 일부 객체 구조를 유지할 수 있다면 도움이 될 것입니다. – Pavel

답변

1

RCall.jl 패키지를 가리키면 열 유형 제한 문제가 해결되었습니다. 이 패키지는 Julia와 R 작업을 통합하는 데 매우 유용합니다. 이 예에서 HDF5를 저장하는 대신 기본 RData 파일을 만들 수 있습니다.

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)"))