我正在尝试将整个矩阵/数组存储到数据框的单个单元格中,但不太记得如何操作。
现在在你说它无法完成之前,我肯定我记得有人在SO上问了一个问题,尽管那不是问题的重点所以我找不到它。
例如,您可以将矩阵存储在矩阵的单个单元格中,如下所示:
myMat <- array(list(), dim=c(2, 2))
myMat[[1, 1]] <- 1:5
myMat[[1, 2]] <- 6:10
# [,1] [,2]
#[1,] Integer,5 Integer,5
#[2,] NULL NULL
诀窍在于使用双括号[[]]
。
现在我无法弄清楚如何为数据框做这件事(或者你可以):
# attempt to make a dataframe like above (except if I use list() it gets
# interpreted to mean the `m` column doesn't exist)
myDF <- data.frame(i=1:5, m=NA)
myDF[[1, 'm']] <- 1:5
# Error in `[[<-.data.frame`(`*tmp*`, 1, "m", value = 1:5) :
# more elements supplied than there are to replace
# this seems to work but I have to do myDF$m[[1]][[1]] to get the 1:5,
# whereas I just want to do myDF$m[[1]].
myDF[[1, 'm']] <- list(1:5)
我想我差不多了。通过最后一次尝试,我可以myDF[[1, 'm']]
检索list(1:5)
,从而myDF[[1, 'm']][[1]]
获取1:5
,但我更愿意myDF[[1, 'm']]
获取1:5
{1}}。
答案 0 :(得分:4)
我想我已经解决了。 初始化数据框非常重要,这样列就可以接受矩阵了。
要执行此操作,请为其指定列表数据类型。请注意I
以保护list()
。
myDF <- data.frame(i=integer(), m=I(list()))
然后您可以照常添加行
myDF[1, 'i'] <- 1
然后使用[[]]
表示法
myDF[[1, 'm']] <- matrix(rnorm(9), 3, 3)
使用[[]]
表示法访问:
> myDF$m[[1]]
[,1] [,2] [,3]
[1,] 0.3307403 -0.2031316 1.5995385
[2,] 0.4588922 0.1631086 -0.2754463
[3,] 0.0568791 1.0358552 -0.1623794
要使用非零行进行初始化,您可以执行此操作(请注意I
以保护向量,并vector('list', 5)
初始化长度为5的空列表以避免浪费存储器):
myDF <- data.frame(i=1:5, m=I(vector('list', 5)))
myDF$m[[1]] <- matrix(rnorm(9), 3, 3)
答案 1 :(得分:3)
我认为诀窍可能是将其作为列表插入:
set.seed(123)
dat <- data.frame(women, m=I(replicate(nrow(women), matrix(rnorm(4), 2, 2),
simplify=FALSE)))
str(dat)
'data.frame': 15 obs. of 3 variables:
$ height: num 58 59 60 61 62 63 64 65 66 67 ...
$ weight: num 115 117 120 123 126 129 132 135 139 142 ...
$ m :List of 15
..$ : num [1:2, 1:2] -0.5605 -0.2302 1.5587 0.0705
..$ : num [1:2, 1:2] 0.129 1.715 0.461 -1.265
...
..$ : num [1:2, 1:2] -1.549 0.585 0.124 0.216
..- attr(*, "class")= chr "AsIs"
dat[[1, "m"]]
[,1] [,2]
[1,] -0.5604756 1.55870831
[2,] -0.2301775 0.07050839
dat[[2, "m"]]
[,1] [,2]
[1,] 0.1292877 0.4609162
[2,] 1.7150650 -1.2650612
编辑:所以问题实际上是关于初始化然后分配。鉴于此,你应该能够像你的问题一样定义一个data.frame:
data.frame(i=1:5, m=I(vector(mode="list", length=5)))
然后您可以这样分配:
dat[[2, "m"]] <- matrix(rnorm(9), 3, 3)