我正在使用 RinRuby gem 在 Ruby 中使用 R。问题是,您只能使用 RinRuby 将包含字符或数字的向量从 R 传递给 Ruby,但我想传递一个 data.frame。
我的第一个想法是将 data.frame 转换为 JSON 对象,我可以将其作为字符串从 R 传递到 Ruby,然后将其转换为 Hash。但这个解决方案似乎相当复杂。
有人有更好的主意吗?
我不知道“使用 Rserve-Ruby-client 而不是 RinRuby”是否是一个更好的主意——也许你有充分的理由使用 RinRuby。但是,Rserve 客户端可用于将数据帧转换为 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]
您可以使用 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 中的数据框只是带有行名和列名的列表。Ruby 是否具有日期时间向量和列表的数据类型?如果是这样,拆开列表结构应该相当简单。另一种方法是使用lapply
(在 R 环境中)按列执行您将在 Ruby 中重新组装的 RinRuby 操作。