2013-04-07 17 views
5

Jak odtworzyć data.frame, którą przetopiłem za pomocą reshape2?Łatwiejszy sposób odtworzenia stopionej ramki danych z powrotem do oryginału

Powtarzalne przykład

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 

Co Próbowałem z dcast

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

rozwiązania tymczasowego

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

Czego mi brakuje? Jest to coś oczywistego, ale nie mogę znaleźć odpowiedzi. Mogłem nawet odpowiedzieć na to pytanie jeszcze przed kimś innym. argh.

+0

Na podstawie wyników próby, myślę, że być może chciałeś użyć 'id.vars', a nie' measure.vars'. Zwróć też uwagę na literówkę w wywołaniu topnienia, która może być domyślna dla wyjścia, które widzisz. –

+0

Tak, złapałeś mój błąd. Dzięki @RicardoSaporta – Maiasaura

+0

Problem polega na tym, że twoja kombinacja zmiennych * nie jednoznacznie identyfikuje wiersz * (ponieważ masz wiele wartości dla każdej kombinacji.W tym przypadku będziesz musiał użyć 'fun.aggregate'. Sprawdź' zabawę. wyjaśnienie agregacji z '? dcast'. Może alternatywą jest użycie' unstack (df, value ~ variable) ', a następnie' cbind' "Gatunek" do tego wyniku ..? – Arun

Odpowiedz

6

Jeśli dodać jakąś formę markera aby wskazać, które oryginalny wiersz element należy, to jest proste:

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) 

Trudności napotykają jest to, że nie ma sposobu, aby określić, które elementy idą w parze. Czy rzędy 1: 5 w roztopionym zestawie są jednym rzędem? czy jest to 2: 6 i 1 jest źle umieszczony? Stopione dane są w rzeczywistości, stopione :)

Powiązane problemy