ここに簡単な答えがあるといいのですが、どこにも見つかりません。
行と列にラベルが付けられた数値行列があります。
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
...
ヒントをいただければ幸いです。
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
...
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
'm'があなたの行列であると仮定します。
data.frame(col = rep(colnames(m), each = nrow(m)),
row = rep(rownames(m), ncol(m)),
value = as.vector(m))
これは、大きな行列で非常に高速に実行され、行列の作成方法、行列内のものへのアクセス方法、および独自のベクトルの作成方法についても少し説明します。
関数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