带有在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
据我了解,该数据框对于矩阵的每一行都包含一行,并且mat字段是矩阵列值的列表。 因此,如何获得包含矩阵的数据帧? 谢谢 !     
已邀请:
我发现data.frames包含令人难以置信的奇怪矩阵,但是:我知道实现此目标的唯一方法隐藏在ѭ2中 试试这个,翻阅一下,看看发生了什么:
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
,然后(必需)手动设置
names
row.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
    
一种更简单的方法是使用矩阵的占位符定义数据框
m <- matrix(c(1, 2, 3, 4), nrow = 2, ncol = 2) 
df <- data.frame(id = 1, mat = rep(0, nrow(m)))
然后分配矩阵。无需使用列表的类或使用
*apply()
函数。
df$mat <- m
    
我遇到了同样的问题,试图了解请打包的汽油数据。使用
$
进行工作。 首先,让我们创建一个矩阵,将其称为Spectrum_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 ...
    
您得到的结果(2行x 3列)是R所期望的结果,因为它等于
cbind
一个向量(
id
,带回收)和一个矩阵(
m
)。 IMO,如果您确实想绑定不同的数据结构,则最好使用
list
array
(当尺寸一致时,不允许将数字和因子值混合使用)。否则,只要将行的行数相同,就可以将矩阵矩阵“ѭ15”到现有的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
(用于数组)功能。     

要回复问题请先登录注册