我正在使用RinRuby gem在Ruby中使用R。問題是,你只能通過RinRuby將包含字符或數字的向量傳遞給Ruby,但我想傳遞一個data.frame。使用RinRuby將數據框架從R傳遞到Ruby
我的第一個想法是將data.frame轉換成一個JSON對象,我可以將它作爲字符串從R傳遞到Ruby,然後將其轉換爲Hash。但是這個解決方案似乎相當複雜。
有沒有人有更好的主意?
我正在使用RinRuby gem在Ruby中使用R。問題是,你只能通過RinRuby將包含字符或數字的向量傳遞給Ruby,但我想傳遞一個data.frame。使用RinRuby將數據框架從R傳遞到Ruby
我的第一個想法是將data.frame轉換成一個JSON對象,我可以將它作爲字符串從R傳遞到Ruby,然後將其轉換爲Hash。但是這個解決方案似乎相當複雜。
有沒有人有更好的主意?
您可以使用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中的Dataframes只是rownames和列名的列表。 Ruby是否具有日期 - 時間向量和列表的數據類型?如果是這樣,那麼拆分列表結構應該相當簡單。另一種方法是使用lapply
(在R環境中)按列執行您將在Ruby中重新組合的RinRuby操作。
我不知道「使用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]