Przeprowadziłem badanie, które z perspektywy czasu (jeden żyje, jeden się uczy :-)) wydaje się generować wielopoziomowe dane. Teraz próbuję zmienić zestaw danych z szerokiego na długi, aby móc go analizować za pomocą np. lme4.Jak przekonwertować szeroką ramkę danych na długą ramkę danych dla struktury wielopoziomowej z "poczwórnym zagnieżdżeniem"?
W ten sposób napotykam na ... wyzwanie, z którym już kilka razy się spotkałem, ale do którego nigdy nie znalazłem dobrego rozwiązania. Tym razem szukałem ponownie, ale prawdopodobnie używam złych słów kluczowych - lub ten problem jest znacznie rzadszy, niż myślałem.
Zasadniczo w tym zestawie danych zmienne_różne wskazują, dla których danych pomiarowych są zbierane. Poprosiłem uczestników o ocenę (ocenę) interwencji (może być cokolwiek naprawdę). Każda interwencja znajduje się w jednej z 6 domen behawioralnych. Ponadto uczestnicy oceniali każdą interwencję, gdy była ona prezentowana samodzielnie lub jednocześnie z inną interwencją lub dwiema innymi interwencjami. Były trzy rodzaje interwencji, wszystkie zostały ocenione wcześniej (t0), a po (t1) przedstawiłem im pewne informacje.
Tak, w istocie, mam dataframe że można regenerować tak:
### Elements of the variable names
measurementMomentsVector <- c("t0", "t1");
interventionTypesVector <- c("fear", "know", "scd");
nrOfInterventionsSimultaneouslyVector <- c(1, 2, 3);
behaviorDomainsVector <- c("diet", "pox", "alc", "smoking", "traff", "adh");
### Generate a vector with all variable names
variableNames <-
apply(expand.grid(measurementMomentsVector,
interventionTypesVector,
nrOfInterventionsSimultaneouslyVector,
behaviorDomainsVector),
1, paste0, collapse="_");
### Generate 5 'participants' worth of data
wideData <- data.frame(matrix(rnorm(5*length(variableNames)), nrow=5));
### Assign names
names(wideData) <- variableNames;
### Add unique id variable for every participants
wideData$id <- 1:5;
więc korzystanie head(wideData)[, 1:5]
widać mniej więcej co dataframe wygląda następująco:
t0_fear_1_diet t1_fear_1_diet t0_know_1_diet t1_know_1_diet t0_scd_1_diet
1 -0.9338191 0.9747453 1.0069036 0.3500103 -0.844699708
2 0.8921867 1.3687834 -1.2005791 0.2747955 1.316768219
3 1.6200200 0.5245470 -1.2910586 1.3211912 -0.174795144
4 0.1543738 0.7535642 0.4726131 -0.3464789 -0.009190702
5 -1.3676692 -0.4491574 -2.0902003 -0.3484678 -2.537501824
Teraz chcesz przekonwertować te dane na długą ramkę danych, z 6 zmiennymi, na przykład "id", "pomiarMoment", "typ interwencji", "nrOfInterventionsSimultaneously", "behaviorDomain" i "evaluation", gdzie pierwsza zmienna oznacza uczestników, do których rekord należy, las t zmienną jest wynik (ocena, ocena, ocena), uczestnicy podali konkretną interwencję, a cztery zmienne pośrednie wskazują, która interwencja jest dokładnie oceniana.
Mogę prawdopodobnie napisać jakiś "niestandardowy" kod tylko dla tego problemu, ale spodziewam się, że R "ma coś do tego". I już zostały gry z reshape2, np:
longData <- reshape(wideData, varying=1:(ncol(wideData)-1),
idvar="id",
sep="_", direction="long")
Ale nie udało się odgadnąć zmienne w czasie zmienne:
Error in guess(varying) :
failed to guess time-varying variables from their names
mam zmaga się z tym już kilka razy, i nie uda mi się znaleźć żadnych odpowiedzi w Internecie. A teraz naprawdę muszę iść dalej, więc pomyślałem, że spróbuję tego jako ostatni wysiłek zanim ucieknę się do napisania czegoś na zamówienie :-)
Byłbym bardzo wdzięczny za wszelkie wskazówki, które każdy może dać !!!
Jaka jest wartość 'firstSecondOccurrenceVector'? – krlmlr
Przepraszam, to było resztki sprzed wyjaśnienia! To już nie ważne :-) Przepraszamy za zamieszanie! – Matherion
Nie przepraszaj. Zamiast tego edytuj kod, aby działał. –