使用RinRuby将data.frame从R传递给Ruby

时间:2013-02-10 01:33:02

标签: ruby r

我正在使用RinRuby gem在Ruby中使用R。问题是,你只能使用RinRuby将包含字符或数字的向量从R传递给Ruby,但我想传递data.frame。

我的第一个想法是将data.frame转换为JSON对象,我可以将其作为字符串从R传递给Ruby,然后将其转换为Hash。但这个解决方案似乎相当复杂。

有没有人有更好的主意?

2 个答案:

答案 0 :(得分:2)

我不知道“使用Rserve-Ruby-client而不是RinRuby”是一个更好的想法 - 也许你有充分的理由使用RinRuby。但是,Rserve client可用于将数据帧转换为Ruby数组:

require 'rserve'
con = Rserve::Connection.new
df1 = con.eval("data.frame(a = c(1:10), b = c(11:20))")
df1 = df1.to_ruby
#<Array:69904955249600 [a=12345678910, b=11121314151617181920]>
df1['a']
# [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

答案 1 :(得分:1)

您可以使用dump或dput函数返回R对象的ASCII表示。

> dump('dat', file="")
dat <-
structure(list(group = structure(c(1L, 1L, 2L, 2L), .Label = c(" pilot01", 
" pilot02"), class = "factor"), val2 = structure(c(1L, 2L, 1L, 
2L), .Label = c("t1", "t3"), class = "factor"), val1 = c(429.226015, 
693.795607, 262.798468, 325.854107), val1time = structure(c(29229.226015, 
29493.795607, 29062.798468, 29125.854107), class = c("POSIXct", 
"POSIXt"))), .Names = c("group", "val2", "val1", "val1time"), row.names = c(NA, 
-4L), class = "data.frame")
> dput(dat)
structure(list(group = structure(c(1L, 1L, 2L, 2L), .Label = c(" pilot01", 
" pilot02"), class = "factor"), val2 = structure(c(1L, 2L, 1L, 
2L), .Label = c("t1", "t3"), class = "factor"), val1 = c(429.226015, 
693.795607, 262.798468, 325.854107), val1time = structure(c(29229.226015, 
29493.795607, 29062.798468, 29125.854107), class = c("POSIXct", 
"POSIXt"))), .Names = c("group", "val2", "val1", "val1time"), row.names = c(NA, 
-4L), class = "data.frame")

R中的数据帧只是带有rownames和列名的列表。 Ruby是否具有日期时间向量和列表的数据类型?如果是这样,拆分列表结构应该相当简单。另一种方法是使用lapply(在R环境中)逐列执行您将在Ruby中重组的RinRuby操作。