data.frame,其中包含R中的矩阵

Sch*_*ron 4 r dataframe

我试图在R中的数据框中放入一些矩阵,例如:

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

但是当我这样做时,我得到一个包含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
Run Code Online (Sandbox Code Playgroud)

据我了解,数据帧包含矩阵每行的一行,mat字段是矩阵列值列表.

那么,我如何获得包含矩阵的数据帧?

谢谢 !

Ben*_*ker 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)
Run Code Online (Sandbox Code Playgroud)

这是一种奇怪的后门解决方案.创建一个列表,将其类更改为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
Run Code Online (Sandbox Code Playgroud)


ada*_*ich 5

一种更简单的方法是使用矩阵的占位符定义数据框

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

然后分配矩阵。无需使用列表的类或使用*apply()函数。

df$mat <- m
Run Code Online (Sandbox Code Playgroud)


zoc*_*c99 5

我在尝试理解pls包中的汽油数据时遇到了同样的问题。用于$工作。首先,我们创建一个矩阵,将其命名为spectrum_mat,然后创建一个命名为response_var1 的向量。

spectra_mat = matrix(1:45, 9, 5)
response_var1 = seq(1:9)
Run Code Online (Sandbox Code Playgroud)

现在我们将向量response_var1放入一个新的数据框中——我们称之为df。

df = data.frame(response_var1)
df$spectra = spectra_mat
Run Code Online (Sandbox Code Playgroud)

去检查,

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 ...
Run Code Online (Sandbox Code Playgroud)