2016-08-05 1 views
0

Я использую продольное исследование в длинном формате, и я пытаюсь создать фиктивную переменную, если человек НЕ получил степень в колледже по возрасту 25. Мои данные выглядит примерно так:Связывание нового значения переменной со всеми ответами отдельного пользователя в длинных данных

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 

Как я пытался показать, есть довольно много недостающих точек данных для ответов на опрос в соответствующие годы. Но ясно, если ответчик не ответит в последующие годы, можно предположить, что у них не было степени, когда они были < 25.

Попытка быть как можно более общей, как я могу создать новую переменную, которая зависит от всех значений переменных только одного человека, то есть для ID = 1, 2, 3 и т. Д.?

Извините, если я не понял!

Edit:

К сожалению моя вина, данные, используемые, чтобы быть в широком формате и переменные означают, имеет ли респондент высшее образование в 1998, 2000, 2002 и т.д. (со значением, обозначающих == 1 ответ TRUE, 0 == FALSE), CYRB действительно год рождения, таблица редактируется для ожидаемого результата моей желаемой фиктивной переменной будет:

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 

т.е. если респондент отвечает в любом обследовании в возрасте до 25 лет что он/она не имеет степени в колледже, манекен принимает значение 1.

Надеюсь, это немного яснее.

+3

Вы не очень понятно, на самом деле. Каков ваш ожидаемый результат? Год рождения CYRB? Что такое 'DEG98' Vs' DEG00' для ID = 1 ?, что означает переменная 'VALUE'? – Sotos

+0

Каковы значения новой переменной, которая должна быть для ID = 1, 2, 3, учитывая данные в вашем примере? –

+0

Извините, я был действительно неряшлив в первый раз, отредактировал для ясности! – Milhouse

ответ

1

Предполагая, что вы имели в виду "DEG98" в первом ряду для ID 2:

Во-первых, восстановить возраст респондента:

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 

Используйте функцию any() проверить свои критерии:

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

Объединить значения фиктивных данных с исходным фреймворком данных:

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

Выход:

> 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: более экономное решение с использованием dplyr пакета. Во-первых, написать getYear() функцию для преобразования DEGxx к фактическому году:

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

Тогда преобразование набора данных:

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

Выход:

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

большое спасибо, вот что я искал! – Milhouse

Смежные вопросы