2016-08-05 13 views
0

Ich verwende eine Längsschnittstudie im langen Format, und ich versuche, eine Dummy-Variable für erstellen, wenn eine Person nicht einen Hochschulabschluss bis zum Alter von 25. Meine Daten sieht etwa so aus:Verknüpfen neuer Variablenwert auf alle Antworten von einzelnen in langen Daten

ID CYRB VAR  VALUE 
1 1983 DEG98 1 
1 1983 DEG00 1 
1 1983 DEG02 1 
1 1983 DEG04 0 
2 1979 DEG08 0 
2 1979 DEG00 0 
2 1979 DEG02 1 
2 1979 DEG04 1 
3 1978 DEG98 NA 
3 1978 DEG00 NA 
3 1978 DEG02 NA 
3 1978 DEG04 0 

Als ich versucht habe, zu veranschaulichen, gibt es durchaus ein paar fehlende Datenpunkte für Antworten auf die Umfrage in den betreffenden Jahren. Aber klar, wenn der Befragte in späteren Jahren nicht antwortet, kann gefolgert werden, dass sie auch keinen Abschluss hatten.

Versuchen Sie, so allgemein wie möglich zu sein, wie kann ich eine neue Variable erstellen, die von allen Variablenwerten nur einer Person abhängt, d. H. Für ID = 1, 2, 3 usw.?

Sorry, wenn ich nicht klar bin!

Edit:

Leider meine Schuld, verwendet die Daten im Wide-Format und die Variablen zu bezeichnen, ob die Befragten im Jahr 1998 einen Hochschulabschluss hat, 2000, 2002 usw. (mit einem Wert bezeichnet die Reaktion 1 == TRUE, 0 == FALSE), CYRB ist in der Tat das Geburtsjahr, die Tabelle für die erwartete Ausgabe meiner gewünschten Dummy-Variable bearbeitet wäre:

ID CYRB VAR  VALUE DUMMY 
1 1983 DEG98 0  0 
1 1983 DEG00 0  0 
1 1983 DEG02 0  0 
1 1983 DEG04 1  0 
2 1979 DEG08 0  0 
2 1979 DEG00 0  0 
2 1979 DEG02 1  0 
2 1979 DEG04 1  0 
3 1978 DEG98 NA  1 
3 1978 DEG00 NA  1 
3 1978 DEG02 NA  1 
3 1978 DEG04 0  1 

das heißt, wenn der Befragte antwortet in einer Umfrage von 25 Jahren weiter, dass er/sie keinen Hochschulabschluss hat, nimmt der Dummy den Wert 1 an.

Hoffe, das ist ein bisschen klarer.

+3

Sie sind eigentlich nicht sehr klar. Was ist Ihre erwartete Leistung? Ist CYRB Geburtsjahr? Was ist 'DEG98' Vs' DEG00' für ID = 1 ?, was steht 'VALUE'? – Sotos

+0

Was sind die Werte der neuen Variablen für ID = 1, 2, 3, angesichts der Daten in Ihrem Beispiel? –

+0

Entschuldigung, ich war wirklich schlampig beim ersten Mal, bearbeitet für Klarheit! – Milhouse

Antwort

1

Angenommen, Sie "DEG98" in der ersten Reihe für ID bedeutete 2:

Zuerst das Alter der Befragten erholen:

d$survey_year <- as.numeric(sapply(d$VAR, substring, 4, 5)) 
d$survey_year <- ifelse(d$survey_year<20, 2000+d$survey_year, 1900+d$survey_year) 
d$age <- d$survey_year - d$CYRB 

Verwenden Sie die any() Funktion Ihre Kriterien zu testen:

degree <- data.frame(DUMMY=c(
    by(d, d$ID, function(x) any(x$VALUE==0 & x$age>25)))) 
degree$ID <- rownames(degree) 

Kombinieren Sie die Dummy-Werte mit dem ursprünglichen Datenrahmen:

out <- merge(d[,c("ID", "CYRB", "VAR", "VALUE")], degree, all.x=TRUE) 

Ausgang:

> out 
    ID CYRB VAR VALUE DUMMY 
1 1 1983 DEG98  0 FALSE 
2 1 1983 DEG00  0 FALSE 
3 1 1983 DEG02  0 FALSE 
4 1 1983 DEG04  1 FALSE 
5 2 1979 DEG98  0 FALSE 
6 2 1979 DEG00  0 FALSE 
7 2 1979 DEG02  1 FALSE 
8 2 1979 DEG04  1 FALSE 
9 3 1978 DEG98 NA TRUE 
10 3 1978 DEG00 NA TRUE 
11 3 1978 DEG02 NA TRUE 
12 3 1978 DEG04  0 TRUE 

EDIT: Eine parsimonious Lösung des dplyr Paket. Zuerst schreibt eine getYear() Funktion DEGxx auf das aktuelle Jahr zu konvertieren:

getYear <- function(x) { 
    x <- as.numeric(substring(x, 4, 5)) 
    ifelse(x<16, 2000+x, 1900+x) 
} 

Dann den Datensatz transformieren:

library(dplyr) 
d %>% group_by(ID) %>% 
    mutate(survey_year=getYear(VAR), 
    age=survey_year - CYRB, 
    DUMMY=any(VALUE==0 & age>25)) 

Ausgang:

Source: local data frame [12 x 7] 
Groups: ID [3] 

     ID CYRB VAR VALUE DUMMY survey_year age 
    (int) (int) (fctr) (int) (lgl)  (dbl) (dbl) 
1  1 1983 DEG98  0 FALSE  1998 15 
2  1 1983 DEG00  0 FALSE  2000 17 
3  1 1983 DEG02  0 FALSE  2002 19 
4  1 1983 DEG04  1 FALSE  2004 21 
5  2 1979 DEG98  0 FALSE  1998 19 
6  2 1979 DEG00  0 FALSE  2000 21 
7  2 1979 DEG02  1 FALSE  2002 23 
8  2 1979 DEG04  1 FALSE  2004 25 
9  3 1978 DEG98 NA TRUE  1998 20 
10  3 1978 DEG00 NA TRUE  2000 22 
11  3 1978 DEG02 NA TRUE  2002 24 
12  3 1978 DEG04  0 TRUE  2004 26 
+0

vielen dank, das ist was ich gesucht habe! – Milhouse