2010-08-12 10 views
5

Ich fange gerade an, über die Grundlagen in R hinaus zu kommen und bin zu einem Punkt gekommen, wo ich etwas Hilfe benötige. Ich möchte einige Daten umstrukturieren. Hier ist, was eine Probe Datenrahmen kann wie folgt aussehen:Daten in R reorganisieren

ID Sex Res Contact 
1 M MA ABR 
1 M MA CON 
1 M MA WWF 
2 F FL WIT 
2 F FL CON 
3 X GA XYZ 

möchte ich die Daten aussehen:

ID SEX Res ABR CON WWF WIT XYZ 
1 M MA 1 1 1 0 0 
2 F FL 0 1 0 1 0 
3 X GA 0 0 0 0 1 

Was sind meine Optionen? Wie würde ich das in R machen?

Kurz gesagt, ich möchte die Werte der Spalte CONT behalten und sie als Spaltennamen im restrukturierten Datenrahmen verwenden. Ich möchte eine variable Menge von Spalten konstant halten (im obigen Beispiel habe ich ID, Sex und Res konstant gehalten).

Ist es auch möglich, die Werte in den umstrukturierten Daten zu kontrollieren? Ich möchte vielleicht die Daten als Binärdaten behalten. Ich möchte vielleicht, dass einige Daten den Wert haben, die Anzahl der Male, die jeder Kontaktwert für jede ID existiert.

Antwort

12

Das Paket reshape ist, was Sie wollen. Dokumentation hier: http://had.co.nz/reshape/. Nicht mein eigenes Horn zu blasen, aber ich habe auch ein paar Notizen auf reshape ‚geschrieben s verwenden hier: http://www.ling.upenn.edu/~joseff/rstudy/summer2010_reshape.html

Für Ihren Zweck sollte dieser Code

library(reshape) 
data$value <- 1 
cast(data, ID + Sex + Res ~ Contact, fun = "length") 
+0

ich habe für eine lange Zeit unter Verwendung von R, und ich wusste nicht, dass Sie Daten $ value tun könnten <- 1 anstelle Wert der Daten $ <- rep (1, nrow (Daten)). Ich kann nicht glauben, dass ich das nie versucht habe - hat das immer funktioniert? –

+0

@Daniel Sie sollten auch 'data $ variable <- 1; data $ variable [data $ Group == "A"] <- 2' – JoFrhwld

+0

Ich wusste, dass Hadleys Umgestaltungspaket wahrscheinlich die Antwort war, aber es fiel mir schwer, mich damit zu beschäftigen. Was macht der Wert $ in dem Code bei der Zuweisung zu 1? – Btibert3

2

model.matrix funktioniert gut arbeiten (dies wurde gefragt, vor kurzem, und gappy had this good answer):

> model.matrix(~ factor(d$Contact) -1) 
    factor(d$Contact)ABR factor(d$Contact)CON factor(d$Contact)WIT factor(d$Contact)WWF factor(d$Contact)XYZ 
1     1     0     0     0     0 
2     0     1     0     0     0 
3     0     0     0     1     0 
4     0     0     1     0     0 
5     0     1     0     0     0 
6     0     0     0     0     1 
attr(,"assign") 
[1] 1 1 1 1 1 
attr(,"contrasts") 
attr(,"contrasts")$`factor(d$Contact)` 
[1] "contr.treatment" 
+0

Eark! Missverstanden die Frage. Du könntest meine Antwort benutzen und dann 'tapply' benutzen, aber JoFrhwlds Antwort ist einfacher. – Vince