将新变量值与长数据中个人的所有响应联系起来
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
我正在使用长格式的纵向调查,并且我正在尝试创建一个虚拟变量来判断一个人是否在 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