2010-08-12 14 views
5

Właśnie zaczynam wychodzić poza podstawy R i doszedłem do punktu, w którym potrzebuję pomocy. Chcę zmienić niektóre dane. Oto co dataframe próbka może wyglądać następująco:Dane dotyczące restrukturyzacji w R

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 

Chcę dane wyglądać:

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 

Jakie są opcje? Jak mam to zrobić w R?

W skrócie, staram się zachować wartości kolumny CONT i używać ich jako nazw kolumn w zrekonstruowanej ramce danych. Chcę utrzymywać zmienny zestaw kolumn stałych (w powyższym przykładzie posiadałem stałe ID, płeć i Res).

Czy możliwe jest kontrolowanie wartości w zrestrukturyzowanych danych? Mogę chcieć zachować dane jako binarne. Możliwe, że niektóre dane mają tę wartość, ile razy każda wartość kontaktu istnieje dla każdego identyfikatora.

Odpowiedz

12

Pakiet reshape jest tym, czego potrzebujesz. Dokumentacja tutaj: http://had.co.nz/reshape/. Nie trąbienie klaksonu moje własne, ale mam również napisane jakieś notatki na reshape „s używać tutaj: http://www.ling.upenn.edu/~joseff/rstudy/summer2010_reshape.html

Dla celów, ten kod powinien działać

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

Używam R przez długi czas i nigdy nie wiedziałem, że można zrobić danych $ wartość <- 1 zamiast danych $ wartość <- rep (1, nrow (dane)). Nie mogę uwierzyć, że nigdy tego nie próbowałem - czy to zawsze działa? –

+0

@Daniel Powinieneś także wypróbować 'zmienna $ danych <- 1; data $ zmienna [dane $ grupa == "A"] <- 2' – JoFrhwld

+0

Wiedziałem, że pakiet przekształcenia Hadleya był prawdopodobnie odpowiedzią, ale trudno mi było się z tym pogodzić. W kodzie, co robi wartość danych $ z przypisaniem do 1? – Btibert3

2

model.matrix działa świetnie (to poproszono niedawno i 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! Źle zrozumiałem pytanie. Możesz użyć mojej odpowiedzi, a następnie użyć 'tapply', ale odpowiedź JoFrhwlda jest łatwiejsza. – Vince

Powiązane problemy