2016-09-07 6 views
1

Ich möchte ein reshape rückgängig machen nach Konvertierung eines langen Datenrahmens in Wide-Format durch die Generierung von nummerierten Versionen von einzelnen Variablen. Die Herausforderung, der ich mich gegenübersehe, ist dies, wenn mehrere Schlüsselvariablen und mehrere Variablen wieder kombiniert werden müssen. Ich habe versucht, gather von tidyr vergeblich zu verwenden. Nehmen Sie dieses Beispiel für lange Daten:Rückgängig machen Umformatieren mit beliebig vielen Spalten

toy = data.frame(
    first_key = rep(c("A", "B", "C"), each = 6), 
    second_key = rep(rep(c(1:2), each = 3), 3), 
    colors = c("red", "yellow", "green", "blue", "purple", "beige"), 
    days = c("Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"), 
    index = c(1:3) 
) 

, das die folgenden data.frame gibt:

first_key second_key colors  days index 
     A   1 red Monday  1 
     A   1 yellow Tuesday  2 
     A   1 green Wednesday  3 
     A   2 blue Thursday  1 
     A   2 purple Friday  2 
     A   2 beige Saturday  3 
     B   1 red Monday  1 
     B   1 yellow Tuesday  2 
     B   1 green Wednesday  3 
     B   2 blue Thursday  1 
     B   2 purple Friday  2 
     B   2 beige Saturday  3 
     C   1 red Monday  1 
     C   1 yellow Tuesday  2 
     C   1 green Wednesday  3 
     C   2 blue Thursday  1 
     C   2 purple Friday  2 
     C   2 beige Saturday  3 

es auf ein breites Format mit nummerierten Versionen der Variablen umformen sieht wie folgt aus:

toy_wide = reshape(toy, idvar = c("first_key", "second_key"), 
      timevar = "index", direction = "wide", sep = "_") 

Und gibt dieses breite Format:

first_key second_key colors_1 days_1 colors_2 days_2 colors_3 days_3 
     A   1  red Monday yellow Tuesday green Wednesday 
     A   2  blue Thursday purple Friday beige Saturday 
     B   1  red Monday yellow Tuesday green Wednesday 
     B   2  blue Thursday purple Friday beige Saturday 
     C   1  red Monday yellow Tuesday green Wednesday 
     C   2  blue Thursday purple Friday beige Saturday 

Aber wie bekomme ich es zurück zum ursprünglichen Format? Ich habe Folgendes versucht, bekomme aber einen Fehler.

tidyr::gather(toy_wide, key = c("first_key", "second_key"), value = c("days", "colors"), 
     colors_1:days_3, factor_key = TRUE) 

Error: Invalid column specification

Antwort

1

Hier ist eine weitere Option mit melt von data.table die measurepatterns mehrere nehmen.

library(data.table) 
melt(setDT(toy_wide), measure = patterns("^colors", "^days"), 
    value.name = c("colors", "days"), variable.name = "index")[order(first_key, second_key)] 
+1

Große Generalisierbarkeit! – Nancy

4

Wenn Sie reshape verwenden breit zu gehen, verwenden Sie reshape lange wieder zu gehen:

reshape(toy_wide, idvar = c("first_key", "second_key"), timevar="index", 
     varying=3:8, direction="long", sep="_") 

#  first_key second_key index colors  days 
#A.1.1   A   1  1 red Monday 
#A.2.1   A   2  1 blue Thursday 
# ... 

Wenn Sie den Satz von varying= Variablen angeben (die eine Liste sein kann von Spalten 3:8 Werte Spaltenwerte zum Löschen -(1:2) oder Spaltennamen als Zeichenvektor c("a","b")) und sep= dann reshape können die Ausgabevariablennamen apprecia erraten tely.

Es ist oft hilfreich, diese Art von Reshapes in mehreren Schritten zu tun, es klar zu halten und bessere Dinge zu automatisieren:

ids <- c("first_key", "second_key") 
reshape(toy_wide, idvar=ids, timevar="index", 
     varying=setdiff(names(toy_wide), ids), direction="long", sep="_") 
Verwandte Themen