web-dev-qa-db-ja.com

数値行列をdata.table(またはdata.frame)に変換する

ここに簡単な答えがあるといいのですが、どこにも見つかりません。

行と列にラベルが付けられた数値行列があります。

     1    2    3    4
a    6    7    8    9
b    8    7    5    7
c    8    5    4    1
d    1    6    3    2

次の形式のdata.table(または変換できるdata.frame)が欲しいのですが。

    col     row    value
    1       a      6
    1       b      8
    1       c      8
    1       d      1
    2       a      7
    2       b      7
    2       c      5
    2       d      6
    ...

ヒントをいただければ幸いです。

9
Ina

Reshape2からmeltを使用します。

library(reshape2)
#Fake data
x <- matrix(1:12, ncol = 3)
colnames(x) <- letters[1:3]
rownames(x) <- 1:4
x.m <- melt(x)
x.m

   Var1 Var2 value
1     1    a     1
2     2    a     2
3     3    a     3
4     4    a     4
...
13
Chase

as.tableおよびas.data.frame関数は一緒にこれを行います:

> m <- matrix( sample(1:12), nrow=4 )
> dimnames(m) <- list( One=letters[1:4], Two=LETTERS[1:3] )
> as.data.frame( as.table(m) )
   One Two Freq
1    a   A    7
2    b   A    2
3    c   A    1
4    d   A    5
5    a   B    9
6    b   B    6
7    c   B    8
8    d   B   10
9    a   C   11
10   b   C   12
11   c   C    3
12   d   C    4
16
Greg Snow

'm'があなたの行列であると仮定します。

data.frame(col = rep(colnames(m), each = nrow(m)), 
           row = rep(rownames(m), ncol(m)), 
           value = as.vector(m))

これは、大きな行列で非常に高速に実行され、行列の作成方法、行列内のものへのアクセス方法、および独自のベクトルの作成方法についても少し説明します。

7
John

関数data.table()をパラメーターkeep.rownamesとともに使用して、行列をdata.tableクラスに変換できます。

# Example data
x

  a b  c
1 1 5  9
2 2 6 10
3 3 7 11
4 4 8 12

# Conversion
data.table(x, keep.rownames = TRUE) # inserts rownames into column "rn"

   rn a b  c
1:  1 1 5  9
2:  2 2 6 10
3:  3 3 7 11
4:  4 4 8 12
0
Tapper