2011-05-26 98 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 ...