Funkcje topienia/odlewania w pakiecie przekształcania są świetne, ale nie jestem pewien, czy istnieje prosty sposób ich zastosowania, gdy mierzone zmienne są różnych typów. Na przykład, tutaj jest to fragment z gdzie każda MD zapewnia płeć i ciężar trzech pacjentów:Alternatywy dla statystyk :: zmiana kształtu
ID PT1 WT1 PT2 WT2 PT3 WT3
1 "M" 170 "M" 175 "F" 145
...
której celem jest, aby przekształcić tak, każdy rząd jest pacjentem:
ID PTNUM GENDER WEIGHT
1 1 "M" 170
1 2 "M" 175
1 3 "F" 145
...
Użycie funkcja zmiany kształtu w pakiecie statystyk jest jedną z opcji, o których wiem, ale zamieszczam tutaj w nadziei, że użytkownicy R bardziej doświadczeni niż ja opublikują inne, mam nadzieję, lepsze metody. Wielkie dzięki!
-
@Vincent Zoonekynd:
Lubiłem Twój przykład dużo, więc uogólnić go do wielu zmiennych.
# Sample data
n <- 5
d <- data.frame(
id = 1:n,
p1 = sample(c("M","F"),n,replace=TRUE),
q1 = sample(c("Alpha","Beta"),n,replace=TRUE),
w1 = round(runif(n,100,200)),
y1 = round(runif(n,100,200)),
p2 = sample(c("M","F"),n,replace=TRUE),
q2 = sample(c("Alpha","Beta"),n,replace=TRUE),
w2 = round(runif(n,100,200)),
y2 = round(runif(n,100,200)),
p3 = sample(c("M","F"),n,replace=TRUE),
q3 = sample(c("Alpha","Beta"),n,replace=TRUE),
w3 = round(runif(n,100,200)),
y3 = round(runif(n,100,200))
)
# Reshape the data.frame, one variable at a time
library(reshape)
d1 <- melt(d, id.vars="id", measure.vars=c("p1","p2","p3","q1","q2","q3"))
d2 <- melt(d, id.vars="id", measure.vars=c("w1","w2","w3","y1","y2","y3"))
d1 = cbind(d1,colsplit(d1$variable,names=c("var","ptnum")))
d2 = cbind(d2,colsplit(d2$variable,names=c("var","ptnum")))
d1$variable = NULL
d2$variable = NULL
d1c = cast(d1,...~var)
d2c = cast(d2,...~var)
# Join the two data.frames
d3 = merge(d1c, d2c, by=c("id","ptnum"), all=TRUE)
-
myśli końcowe: Moja motywacja na to pytanie było poznanie alternatyw dla pakietu przekształcenia innej niż statystykach :: funkcję zmienią. W tej chwili doszedłem do następujących wniosków:
Trzymaj się statystyk :: zmieniaj kształt, kiedy możesz. Tak długo, jak pamiętasz o używaniu listy zamiast prostego wektora dla argumentu "zmiennego", nie będziesz miał problemów. W przypadku mniejszych zbiorów danych - tym razem miałem do czynienia z kilkoma tysiącami przypadków pacjentów z mniej niż 200 zmiennymi - mniejsza prędkość tej funkcji warta jest prostoty kodu.
Aby zastosować metodę rzutowania/topienia w pakiecie przekształcenia Hadleya Wickhama (lub przekształcania2), należy podzielić zmienne na dwa zestawy, z których jeden składa się ze zmiennych numerycznych, a drugi ze zmiennych znakowych. Kiedy twój zbiór danych jest wystarczająco duży, aby znaleźć statystyki :: przekształcić się w nie do zniesienia, wyobrażam sobie, że dodatkowy krok dzielenia zmiennych na dwa zestawy nie będzie tak zły.
Lepiej w jakim sensie? zmiana kształtu jest przeznaczona do takich zadań, więc dlaczego jej nie używać? – Fojtasek
Zmiana kształtu działa tak długo, jak długo pamięta się użycie kanonicznej formy różnych argumentów (lista): [link] (http://www.mail-archive.com/[email protected]/msg160715 .html) Z R, jestem ciągle zaskoczony istnieniem alternatyw, których nie byłem świadomy, więc pomyślałem, że ktoś zamieści inne podejścia. Jednym z przykładów definiowania "lepszego" byłaby szybkość: w moim wprawdzie subiektywnym doświadczeniu, obsada/topnienie wydaje się szybsza niż wbudowana zmiana kształtu. –
Nie zauważyłem tego, dzięki. Teraz zmieniłem bibliotekę z reshape2, aby zmienić kształt.Wciąż możesz użyć funkcji reshape2, jeśli chcesz: będziesz musiał dodać argument wzoru z wartością "" do wywołania colsplit(). –