2011-05-26 103 views
4

我試圖把一些矩陣作爲R一個數據幀矩陣列,是這樣的:data.frame含R中

m <- matrix(c(1,2,3,4), nrow=2, ncol=2) 
df <- data.frame(id=1, mat=m) 

但是,當我這樣做,我得到2數據幀行和3列,而不是1行和2列的數據框。

閱讀文檔,我必須使用I()來避開我的矩陣。

df <- data.frame(id=1, mat=I(m)) 

str(df) 
'data.frame': 2 obs. of 2 variables: 
$ id : num 1 1 
$ mat: AsIs [1:2, 1:2] 1 2 3 4 

據我所知,數據幀包含用於矩陣的每一行一個行,並且所述墊字段是矩陣的列的值的列表。

因此,如何獲得包含矩陣的數據框?

謝謝!

+0

儘管我的回答,我有些同情與其他受訪者:你爲什麼要這麼做?也許我們可以幫助你找到一個更好的R語言... – 2011-05-26 22:20:06

+0

我有輸入和輸出爲矩陣的數據。我希望每個經驗都是一排數據框。 – Scharron 2011-05-27 10:13:41

+0

最近在tidyverse系列的軟件包中,尤其是purrr的發展,使得爲函數式編程創建任意數據類型的嵌套列很有用。矩陣的嵌套列可用作將每個矩陣轉換爲更簡單的結構的準備步驟。 – 2017-04-13 20:23:14

回答

5

我發現含矩陣心態彎曲地怪異data.frames,但:唯一的辦法我知道實現這個隱藏在stats:::simulate.lm

試試這個,捅,看看發生了什麼:

d <- data.frame(y=1:5,n=5) 
g0 <- glm(cbind(y,n-y)~1,data=d,family=binomial) 
debug(stats:::simulate.lm) 
s <- simulate(g0,n=5) 

這是很奇怪的後門解決方案。創建一個列表,將其類別更改爲data.frame,然後(這是需要)手動設置namesrow.names(如果您沒有執行這些最後步驟,數據仍然會在對象中,但它會打印爲雖然它有零行...)

m1 <- matrix(1:10,ncol=2) 
m2 <- matrix(5:14,ncol=2) 
dd <- list(m1,m2) 
class(dd) <- "data.frame" 
names(dd) <- LETTERS[1:2] 
row.names(dd) <- 1:5 
dd 
1

你得到結果(2行×3列)是什麼是要自R意料之中的,因爲它相當於cbind向量(id,具有回收利用)和一個矩陣(m)。

IMO,這將是更好地使用listarray(當尺寸相一致,不允許數字和因素值的組合),如果你真的要綁定不同的數據結構。否則,只需將cbind矩陣轉換爲現有的data.frame(如果兩者具有相同的行數)將執行該作業。例如

x1 <- replicate(2, rnorm(10)) 
x2 <- replicate(2, rnorm(10)) 
x12l <- list(x1=x1, x2=x2) 
x12a <- array(rbind(x1, x2), dim=c(10,2,2)) 

,結果讀

> str(x12l) 
List of 2 
$ x1: num [1:10, 1:2] -0.326 0.552 -0.675 0.214 0.311 ... 
$ x2: num [1:10, 1:2] -0.164 0.709 -0.268 -1.464 0.744 ... 
> str(x12a) 
num [1:10, 1:2, 1:2] -0.326 0.552 -0.675 0.214 0.311 ... 

列表是更容易,如果你打算使用不同尺寸的矩陣使用,並提供他們以同樣的方式組織(對於行)作爲外部數據框架,您可以輕鬆地將它們分組。這裏有一個例子:

df1 <- data.frame(grp=gl(2, 5, labels=LETTERS[1:2]), 
        age=sample(seq(25,35), 10, rep=T)) 
with(df1, tapply(x12l$x1[,1], list(grp, age), mean)) 

您還可以使用lapply(用於列表)和apply(數組)的功能。

4

更簡單的方法來做到這一點是定義一個佔位符的數據幀矩陣

m <- matrix(c(1, 2, 3, 4), nrow = 2, ncol = 2) 
df <- data.frame(id = 1, mat = rep(0, nrow(m))) 

然後到矩陣分配。無需使用列表類或使用功能。

df$mat <- m 
+0

雖然這會讓您將矩陣轉到INTO數據框的列中。對於某些應用程序可能沒有問題(您可以通過i * nrow + ncol訪問元素),但是如果矩陣的大小不同,則會受到限制。 – 2016-04-06 11:07:22

1

我碰到了同樣的問題來試圖瞭解包中的汽油數據。使用$工作。 首先,讓我們創建一個矩陣,讓它叫做spectra_mat,然後叫做response_var1。

spectra_mat = matrix(1:45, 9, 5) 
response_var1 = seq(1:9) 

現在我們把矢量response_var1放在一個新的數據框中 - 讓我們叫它df。

df = data.frame(response_var1) 
df$spectra = spectra_mat 

要檢查,

str(df) 

'data.frame': 9 obs. of 2 variables: 
$ response_var1: int 1 2 3 4 5 6 7 8 9 
$ spectra  : int [1:9, 1:5] 1 2 3 4 5 6 7 8 9 10 ...