2016-08-05 16 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 

正如我试图说明,还有在相关年份调查答复了不少丢失的数据点。但很明显,如果被调查者在晚些时候回答“否”,那么可以推断他们在没有学位时也是如此。

试图尽可能通用,我如何创建一个新的变量,它取决于一个人的所有变量值,即ID = 1,2,3等。

对不起,如果我不清楚!

编辑:

对不起我的错,以前是在宽格式的数据和变量表示受访者是否在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出生年份?对于ID = 1,什么是'DEG98'与'DEG00'?'VALUE'变量代表什么? – Sotos

+0

假设您的示例中的数据是新变量的值应为ID = 1,2,3? –

+0

抱歉,我第一次真的很sl,,编辑清晰! – 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包A更简洁的解决方案。首先,写一个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

相关问题