Einen Paneldatensatz erstellen

Wie rufe ich R-Funktionen auf, wie selektiere ich Daten, ich weiß nicht genau ....

Moderatoren: EDi, jogo

kosa
Beiträge: 27
Registriert: Mo Sep 02, 2019 6:47 pm

Einen Paneldatensatz erstellen

Beitrag von kosa »

Liebe Forumsmitglieder,

ich habe einen Längschnitts-Datensatz im long-format, d.h. jeder Teilnahme an der mehrwelligen Befragung wird in einer Zeile gespeichert. So wird die Teilnahme der Person x mit Teilnahmecode "AH2D" zum ersten Messzeitpunkt in einer Zeile gespeichert und die Teilnahme derselben Person zum zweiten Messzeitpunkt in einer neuen Zeile gespeichert. Insgesamt gab es drei Messzeitpunkt.

Der Datensatz könnte beispielhaft so aussehen:

Code: Alles auswählen

dat<-data.frame(
"id" = c("A","A","A", "B","B","C","C","D"),
"time" = c("1", "2","3", "1", "2","1","3","2"),
"gender" = c("male","male", "male", "female", "female","male","male", "female"),
"age" = c(22,22,23,45,46,67,68,29))
Wie man sehen kann, hat nicht jede Person zu allen drei Messzeitpunkten teilgenommen. Es gibt Personen, die nur einmal (zu Zeitpunkt 1,2 oder 3) und Personen die zweimal (zu Zeitpunkt 1 und 2, 2 und 3 oder 1 und 3) teilgenommen haben.

Ich würde nun gern zwei Spalten erstellen:

In der Spalte "Anzahl Teilnahme" würde ich gern festhalten, wie oft die Person teilgenommen hat. In der zweiten Spalte "Teilnahme" würde ich gern die Kombination der Teilnahme festhalten. Hier gäbe es die Werte: T1, T2, T3, T1&2, T1&3, T2&3, sowie T1&2&3.

Das Ziel ist, dass ich den Datensatz später entsprechend filtern kann.

Ich habe bereits mit dem Package "plm" und der Funktion pdata.frame() versucht so etwas zu erstellen. Mit einem Table-Befehl konnte ich mir sogar für jeden Teilnehmenden anzeigen lassen, zu welchen Zeitpunkten er/sie teilgenommen hat (siehe Bild unten; Anmerkung Datensatz heißt im Bild sub_dat_wide2 und Teilnahmecodes sind etwas komplexer als im Beispiel oben)

Mir gelingt es jedoch nicht, die entsprechenden Spalten, die ich gern hätte, zu erstellen.


Weißt jemand, wie man das am besten macht?

Vielen Dank vorab.:)
Dateianhänge
Bildschirmfoto 2023-10-23 um 16.34.52.png
Athomas
Beiträge: 769
Registriert: Mo Feb 26, 2018 8:19 pm

Re: Einen Paneldatensatz erstellen

Beitrag von Athomas »

In der zweiten Spalte "Teilnahme" würde ich gern die Kombination der Teilnahme festhalten. Hier gäbe es die Werte: T1, T2, T3, T1&2, T1&3, T2&3, sowie T1&2&3.
Warum willst Du das tun: die schön übersichtliche Darstellung als Indikatorvariablen - 1 falls vorhanden, 0 wenn nicht - umwandeln in eine verquaste character-Kombinationsvariable :shock: ?

Ich sehe nicht, dass man dadurch irgendwas besser "filtern" könnte!?
kosa
Beiträge: 27
Registriert: Mo Sep 02, 2019 6:47 pm

Re: Einen Paneldatensatz erstellen

Beitrag von kosa »

Hallo Athomas,

ich würde das gern machen, damit ich für Analysen zum Beispiel die Teilnehmende aussuchen kann, die auch wirklich dreimal mal teilgenommen haben.

Mir ist bewusst, dass ich die Filterung auch über die Darstellung in der Tabelle filtern könnte, aber mir gelingt es zum Beispiel auch nicht diese Tabelle mit den Indikatorvaribalen 1 und 0 für jeden Messzeitpunkt eines Teilnehmenden an meinen dataframe zu mergen.

Da bräuchte ich Hilfe! :)
Athomas
Beiträge: 769
Registriert: Mo Feb 26, 2018 8:19 pm

Re: Einen Paneldatensatz erstellen

Beitrag von Athomas »

aber mir gelingt es zum Beispiel auch nicht diese Tabelle mit den Indikatorvaribalen 1 und 0 für jeden Messzeitpunkt eines Teilnehmenden an meinen dataframe zu mergen.
Woran scheitert es? Das allgemeine Vorgehen beim "mergen" ist Dir klar?
Gib doch einfach ein kleines Beispiel und zeig, was Du machst!
Athomas
Beiträge: 769
Registriert: Mo Feb 26, 2018 8:19 pm

Re: Einen Paneldatensatz erstellen

Beitrag von Athomas »

Ich muss gleich weg, deshalb mach ich mal ein kleines Beispiel, wie man den Datensatz in eine äquivalente "breite" Darstellung überführt - vielleicht hilft es ja was!

Code: Alles auswählen

library(data.table)

dat <- data.table(
  id     = c("A","A","A", "B","B","C","C","D"),
  time   = c("1", "2","3", "1", "2","1","3","2"),
  gender = c("male","male", "male", "female", "female","male","male", "female"),
  age    = c(22,22,23,45,46,67,68,29))

dat.wide <- dcast(dat, id ~ time, value.var=c("gender","age"))
kosa
Beiträge: 27
Registriert: Mo Sep 02, 2019 6:47 pm

Re: Einen Paneldatensatz erstellen

Beitrag von kosa »

Vielen Dank für die ganzen Hinweise und Reindenken.

Die Transformation in einen Wide-Datensatz habe ich auch bereits probiert. Da bekomme ich immer die folgende Warnung: 'Aggregate function missing, defaulting to 'length'.

Hinzukommt, dass das Alter der Teilnehmer, dann nicht mehr angezeigt wird. Das ganze sieht dann so aus:

Bild
Dateianhänge
Bildschirmfoto 2023-10-24 um 11.35.33.png
Athomas
Beiträge: 769
Registriert: Mo Feb 26, 2018 8:19 pm

Re: Einen Paneldatensatz erstellen

Beitrag von Athomas »

Das ist aber nicht das, was ich gemacht habe!?

Code: Alles auswählen

> dat.wide
   id gender_1 gender_2 gender_3 age_1 age_2 age_3
1:  A     male     male     male    22    22    23
2:  B   female   female     <NA>    45    46    NA
3:  C     male     <NA>     male    67    NA    68
4:  D     <NA>   female     <NA>    NA    29    NA
bigben
Beiträge: 2781
Registriert: Mi Okt 12, 2016 9:09 am

Re: Einen Paneldatensatz erstellen

Beitrag von bigben »

In jedem Fall ist es mit einem anderen Datensatz gemacht worden, wie man unschwer an der id-Spalte sehen kann.
Der Datensatz ist hier wichtig:
https://www.statology.org/r-aggregate-f ... to-length/

Anstelle des Bildschirmfotos wäre es interessant zu sehen, ob da irgendwo noch was anderes als 0 und 1 steht.

LG,
Bernhard
---
Programmiere stets so, dass die Maxime Deines Programmierstils Grundlage allgemeiner Gesetzgebung sein könnte
Athomas
Beiträge: 769
Registriert: Mo Feb 26, 2018 8:19 pm

Re: Einen Paneldatensatz erstellen

Beitrag von Athomas »

Ich bitte zu bedenken, dass mein "dcast" die wunderbare Funktion aus dem ebenfalls wunderbaren Package :D "data.table" ist - und nicht das aus "reshape2", auf das sich der verlinkte Artikel bezieht!
bigben
Beiträge: 2781
Registriert: Mi Okt 12, 2016 9:09 am

Re: Einen Paneldatensatz erstellen

Beitrag von bigben »

Der Hinweis ist angemessen und das war mir durchaus bewusst :D . Aaaaber, für dcast.data.table finde ich in der Erklärung des Parameters fun.aggregate den Hinweis, dass dcast.data.table sich ebenso verhält:
Should the data be aggregated before casting? If the formula doesn't identify a single observation for each cell, then aggregation defaults to length with a message.
Ob die message die gleiche ist habe ich freilich nicht geprüft. Die Abhängigkeit von den Daten und das Umschalten auf Zählen scheinen aber identisch zu sein. :)

LG,
Bernhard
---
Programmiere stets so, dass die Maxime Deines Programmierstils Grundlage allgemeiner Gesetzgebung sein könnte
Antworten