13

data.frame の列を 1 つの列に積み重ねるのに問題があります。今、私のデータは次のようになります。

id   time    black   white   red 
a     1       b1      w1     r1
a     2       b2      w2     r2
a     3       b3      w3     r3
b     1       b4      w4     r4
b     2       b5      w5     r5
b     3       b6      w6     r6

次のように data.frame を変換しようとしています。

id   time  colour 
a     1     b1
a     2     b2
a     3     b3
b     1     b4
b     2     b5
b     3     b6
a     1     w1
a     2     w2
a     3     w3
b     1     w4
b     2     w5
b     3     w6
a     1     r1
a     2     r2
.     .     .
.     .     .
.     .     .

この問題には reshape パッケージを使用する必要があると推測していますが、それを使用して複数の列を 1 つの列の下に積み重ねる方法が正確にはわかりません。誰でもこれについて助けてもらえますか?

4

2 に答える 2

13

reshape からの Melt は次のとおりです。

library(reshape)
melt(x, id.vars=c('id', 'time'),var='color')

reshape2(の最新の高速バージョン)を使用 reshapeすると、構文はほとんど同じになります。

ヘルプ ファイルには便利な例があります (?meltおよび へのリンクを参照melt.data.frame)。

あなたの場合、次のようなものが機能します( data.frame が呼び出されると仮定しますDF

library(reshape2)
melt(DF, id.var = c('id','time'), variable.name = 'colour')
于 2012-11-28T03:12:34.737 に答える
9

stackタイトルで「スタッキング」に言及しているため、ベース R の関数も確認できます。

cbind(mydf[1:2], stack(mydf[3:5]))
#    id time values   ind
# 1   a    1     b1 black
# 2   a    2     b2 black
# 3   a    3     b3 black
# 4   b    1     b4 black
# 5   b    2     b5 black
# 6   b    3     b6 black
# 7   a    1     w1 white
# 8   a    2     w2 white
# 9   a    3     w3 white
# 10  b    1     w4 white
# 11  b    2     w5 white
# 12  b    3     w6 white
# 13  a    1     r1   red
# 14  a    2     r2   red
# 15  a    3     r3   red
# 16  b    1     r4   red
# 17  b    2     r5   red
# 18  b    3     r6   red

「黒」、「白」、「赤」の列の値がs の場合、最初にそれらを値factorに変換する必要があります。character

cbind(mydf[1:2], stack(lapply(mydf[3:5], as.character)))
于 2014-03-30T06:34:11.767 に答える