2013-02-10 78 views
0

我正在使用RinRuby gem在Ruby中使用R。問題是,你只能通過RinRuby將包含字符或數字的向量傳遞給Ruby,但我想傳遞一個data.frame。使用RinRuby將數據框架從R傳遞到Ruby

我的第一個想法是將data.frame轉換成一個JSON對象,我可以將它作爲字符串從R傳遞到Ruby,然後將其轉換爲Hash。但是這個解決方案似乎相當複雜。

有沒有人有更好的主意?

回答

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中的Dataframes只是rownames和列名的列表。 Ruby是否具有日期 - 時間向量和列表的數據類型?如果是這樣,那麼拆分列表結構應該相當簡單。另一種方法是使用lapply(在R環境中)按列執行您將在Ruby中重新組合的RinRuby操作。

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] 
相關問題