将新变量值与长数据中个人的所有响应联系起来

Tying new variable value to all responses by individual in long data

我正在使用长格式的纵向调查,并且我正在尝试创建一个虚拟变量来判断一个人是否在 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 等?

对不起,如果我不清楚!

编辑:

对不起我错了,数据以前是宽格式的,变量表示受访者是否在1998年、2000年、2002年等有大学学历(值表示响应1 == TRUE,0 == FALSE),CYRB 确实是出生年份,为我想要的虚拟变量的预期输出编辑的 table 将是:

 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 岁以后的任何调查中回答 he/she 没有大学学位,则虚拟变量取值 1.

希望这更清楚一些。

假设您在 ID 2 的第一行中表示 "DEG98":

首先,恢复受访者的年龄:

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