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 など、1 人の個人のすべての変数値に依存する新しい変数を作成するにはどうすればよいですか?

わかりにくかったらすいません!

編集:

申し訳ありませんが、データは以前はワイド形式で、変数は回答者が 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 になります。

これが少し明確であることを願っています。

4

1 に答える 1

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

EDITdplyr :パッケージを使用したより節約的なソリューション。まず、実際の年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
于 2016-08-05T14:50:16.510 に答える