2017-02-01 5 views
0

Ich habe Daten wie unten haben:Reshape lang breit, wo die meisten Spalten mehrere Werte

IDnum zipcode City   County State 
10011 36006  Billingsley Autauga AL 
10011 36022  Deatsville Autauga AL 
10011 36051  Marbury  Autauga AL 
10011 36051  Prattville Autauga AL 
10011 36066  Prattville Autauga AL 
10011 36067  Verbena  Autauga AL 
10011 36091  Selma   Autauga AL 
10011 36703  Jones   Autauga AL 
10011 36749  Plantersville Autauga AL 
10011 36758  Uriah   Autauga AL 
10011 36480  Atmore  Autauga AL 
10011 36502  Bon Secour Autauga AL 

Ich habe eine Liste von zipcodes, die Städte, die sie umfassen, und Landkreise/Staaten sie sich befinden IDNUM = Numerisch. Wert für Grafschaft und Staat, kombiniert. Liste ist im Format, das Sie jetzt sehen, ich muss es von lang nach breit/vertikal zu horizontal umformen, wobei die IDnum-Variable der eindeutige Bezeichner wird und alle anderen möglichen Wertekombinationen zu breiten Variablen werden.

Dies ist nur ein Beispiel für den Datensatz, es umfasst jede Zip in den USA und enthält mehr Variablen. Ich habe andere ähnliche Fragen und Antworten gesehen, aber nicht, wo es in fast jeder Spalte mehrere Werte gibt.

Es gibt Befehle in SPSS und STATA, die Daten auf diese Weise umformen, in SPSS kann ich einen Restruktur/Fälle zu Vars Befehl ausführen, der 11 Variablen in meinem ursprünglichen Datensatz in etwa 1750, b/c eine Grafschaft hat über 290 Reißverschlüsse und es repliziert die meisten anderen Variablen 290+ mal. Dadurch werden viele Leerzeichen erzeugt, aber ich muss es in eine sehr lange horizontale Datei umformen.

Ich habe umgeformt und umgestalten2, und bin auf die 'Standard auf Länge' Fehlermeldung aufgehängt. Ich habe schmelzen/übertragen, um eine Arbeit zu erledigen, aber dies erzeugt eine Variable, die eine Liste aller Werte ist, anstatt Variablen für jeden Wert zu erstellen.

melted_dupes <- melt(zip_code_list_dupes, id.vars= c("IDnum")) 
HRZ_dupes <- dcast(melted_dupes, IDnum ~ variable, fun.aggregate = list) 

Ich habe versucht, tidyr und dplyr aber in der Syntax verloren. Ich bin etwas überrascht, dass es keine Befehle gibt, die den in anderen Paketen eingebauten Befehlen ähnlich sind, was mich davon ausgeht, dass es solche gibt, und ich habe es einfach nicht herausgefunden.

Jede Hilfe wird geschätzt.

Antwort

1

Sie können dies mit der Basisfunktion reshape, nachdem sie von IDnum in einer fortlaufenden Zählung hinzufügen. Angenommen, Ihre Daten werden in einer df namens data.frame gespeichert:

df2 <- within(df, count <- ave(rep(1,nrow(df)),df$IDnum,FUN=cumsum)) 

Stellt eine neue Spalte der aufeinander folgenden Zählung genannt „Zeit“. Und jetzt können wir reshape zu Großformat

reshape(df2,direction="wide",idvar="IDnum",timevar="count") 
 
    IDnum zipcode.1  City.1 County.1 State.1 zipcode.2  City.2 County.2 State.2 zipcode.3 City.3 County.3 State.3 zipcode.4  City.4 County.4 State.4 
1 10011  36006 Billingsley Autauga  AL  36022 Deatsville Autauga  AL  36051 Marbury Autauga  AL  36051 Prattville Autauga  AL 

(Ausgabe abgeschnitten, geht den ganzen Weg zu zipcode.12, etc.)

+0

Thank you! Wie bekomme ich das im Dataframe angezeigt? Ich benutze RStudio, und das Ergebnis zeigt mir die Variablennamen, die ich erwarten würde, aber es ist alles in der Konsole, und ich schaue auf das DataPane, und es sagt immer noch 43, xxxx Obs von 12 Variablen, nicht 3, xxx obs von 1750 Variablen. Fehle ich etwas? Wie bekomme ich das Ergebnis, um tatsächlich im Datenrahmen angezeigt zu werden, damit ich es anzeigen kann, anstatt nur in der Konsole? Ich war auch auf der Suche nach einer sequentiellen Anzahl Var, also danke auch dafür. –

0

Möglicherweise gibt es einen effizienteren Weg, aber versuchen Sie Folgendes. Ich habe meinen eigenen (Beispiel-) Datensatz verwendet, der dem Ihren sehr ähnlich ist. Führen Sie den Prozess Schritt für Schritt aus, um zu sehen, wie es funktioniert, da Sie einige Dinge im Code ändern müssen.

library(dplyr) 
library(tidyr) 

# get example data 
dt = data.frame(id = c(1,1,1,2,2), 
zipcode = c(4,5,6,7,8), 
city = c("A","B","C","A","C"), 
county = c("A","B","C","A","C"), 
state = c("A","B","C","A","C")) 

dt 

# id zipcode city county state 
# 1 1  4 A  A  A 
# 2 1  5 B  B  B 
# 3 1  6 C  C  C 
# 4 2  7 A  A  A 
# 5 2  8 C  C  C 


# get maximum number of rows for a single id 
# this will help you get the wide format 
max_num_rows = max((dt %>% count(id))$n) 

# get names of columns to reshape 
col_names = names(dt)[-1] 

dt %>% 
group_by(id) %>% 
mutate(nrow = paste0("row",row_number())) %>% 
unite_("V",col_names) %>% 
spread(nrow, V) %>% 
unite("z",matches("row")) %>% 
separate(z, paste0(col_names, sort(rep(1:max_num_rows, ncol(dt)-1))), convert=T) %>% 
ungroup() 

# # A tibble: 2 × 13 
#  id zipcode1 city1 county1 state1 zipcode2 city2 county2 state2 zipcode3 city3 county3 state3 
# * <dbl> <int> <chr> <chr> <chr> <int> <chr> <chr> <chr> <int> <chr> <chr> <chr> 
# 1  1  4  A  A  A  5  B  B  B  6  C  C  C 
# 2  2  7  A  A  A  8  C  C  C  NA <NA> <NA> <NA> 
Verwandte Themen