2013-04-07 11 views
5

Come ricreare uno data.frame che ho fuso con reshape2?Modo più semplice per ricostituire un frame di dati fuso indietro all'originale

esempio riproducibile

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 

Quello che ho provato con dcast

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

soluzione temporanea

# 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) 
    }) 

Cosa mi manca? È qualcosa di ovvio ma non riesco a capire la risposta. Potrei aver persino risposto per qualcun altro qui prima. Argh.

+0

In base all'output di esempio, penso che potresti aver pensato di utilizzare 'id.vars' not' measure.vars'. Inoltre, noterai l'errore di battitura nella tua chiamata da fondere, che potrebbe essere l'impostazione predefinita per l'output che stai vedendo. –

+0

Sì, hai capito il mio errore. Grazie @RicardoSaporta – Maiasaura

+0

Il problema è che la combinazione di variabili * non identifica in modo univoco la riga * (poiché hai più valori per ogni combinazione. In questo caso dovrai usare 'divertimento.aggregare' .Controlla' divertente. spiegazione aggregata di '? dcast'. Forse un'alternativa è usare' unstack (df, value ~ variable) 'e quindi' cbind' "Species" a questo risultato ..? – Arun

risposta

6

Se aggiunge una qualche forma di marcatore per indicare quale riga originale di un elemento appartiene, allora è facile:

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) 

La difficoltà che si è verificato è che non v'è alcun modo per identificare quali oggetti vanno insieme. Le righe 1: 5 nel fuso fissano una riga? o è il 2: 6 e il 1 è fuori posto? I dati fusi sono infatti fusi :)

Problemi correlati