2013-04-07 9 views
5

reshape2で溶けたdata.frameをどのように作り直すのですか?溶融したデータフレームを元に戻す簡単な方法

再現例

library(reshape2) 
library(plyr) 
data(iris) 
df <- melt(iris, id.vars="Species") 
head(df) 
    Species  variable value 
1 setosa Sepal.Length 5.1 
2 setosa Sepal.Length 4.9 
3 setosa Sepal.Length 4.7 
4 setosa Sepal.Length 4.6 
5 setosa Sepal.Length 5.0 
6 setosa Sepal.Length 5.4 
# Great, I'd like to get the original iris back 

私はdcast

dcast(df, Species~variable, value.var = "value") 
    # should work but doesn't 

一時的な解決策を試してみた何

# This works but clearly it shouldn't be this hard. 
ddply(df, .(Species), function(x) { 
    Species <- unique(x$Species) 
    x$id <- 1:dim(x)[1] 
    x$Species <- NULL 
    dat <- unstack(x, value~variable) 
    dat$Species <- Species 
    return(dat) 
    }) 

私は何が欠けていますか?明らかなことですが、答えを理解することはできません。私は前に他の誰かのためにそれに答えているかもしれません。アー。

+0

サンプルの出力に基づいて、 'measure.vars'ではなく' id.vars'を使うつもりだったと思います。また、あなたが見ているアウトプットをデフォルトにしているかもしれないあなたの呼び出しのタイプミスに注意してください。 –

+0

うん、あなたは私の間違いをキャッチした。ありがとう@RicardoSaporta – Maiasaura

+0

問題は、変数の組み合わせ*が行*を一意に特定しないということです(すべての組み合わせに対して複数の値があるので、この場合は 'fun.aggregate'を使用する必要があります。 '?dcast'からの' aggregate'の説明です。代わりに 'unstack(df、value〜variable)'を使用し、 'cbind'" Species "を使ってこの結果にすることができます..? – Arun

答えて

6

アイテムが属するオリジナルどの行を示すために、マーカーのいくつかのフォームを追加し場合、それは簡単です:

require(reshape2) 
iris$rn <- seq_len(nrow(iris)) 
molten <- melt(iris, id.vars = c("Species", "rn")) 

# just a one-liner 
dcast(molten, rn + Species ~ variable) 

あなたが直面している困難に方法がないということです一緒に行くアイテムを特定する。溶融セットの1:5列は1列ですか?またはそれは2:6で、1は間違っていますか?溶融したデータは実際には溶けています:)

関連する問題