8

行列/配列全体をデータフレームの単一のセルに格納しようとしていますが、その方法を完全に思い出せません。

できないと言う前に、誰かが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:5myDF[[1, 'm']]1:5

4

2 に答える 2

5

私はそれを解決したと思います。列が行列を受け入れる準備ができるように、データフレームを初期化することが重要です。

これを行うには、リストデータ型を指定します。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ベクトルを保護し、メモリの浪費を避けるために長さ5のvector('list', 5)のリストを初期化することに注意してください)。

myDF <- data.frame(i=1:5, m=I(vector('list', 5)))
myDF$m[[1]] <- matrix(rnorm(9), 3, 3)
于 2012-11-22T03:36:38.947 に答える
4

秘訣はそれをリストとして挿入することかもしれないと思います:

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)
于 2012-11-22T03:16:39.510 に答える