2016-07-26 27 views
2

ダミー変数を構築する私のデータセットは、(。GRADEXXは、学校のグレードを表す、年XXの学校への出席を示すATTXXダミーVAR)は、多くの条件(R)

この

ID YOB ATT94 GRADE94 ATT96 GRADE96 ATT 96 ..... 
1 1975  1  12  0  NA 
2 1985  1  3  1  5 
3 1977  0  NA  0  NA 
4 ...... 

ようになります19,20歳のときに個人が学校に通っているならば、= 1のダミー変数を作成しようとしています。例えばYOB = 1988とATT98 = 1の場合、新しい変数= 1などです。これはdplyrでmutateを使って試していますが、私はR(そして一般的にはコーディングしています)に新しいので、エラー以外は何も得られませんコードを書く。

ありがとうございます、ありがとうございます。

編集:だから

、私はちょうど私が少しだけ長い形式のデータテーブルに別の列を追加するようにコードを変更し、何かが間違っていることに気付きました。ここで最後にやったことがあります:

df %>% 
    melt(id = c("ID", "DOB") %>% 
    tbl_df() %>% 
    mutate(dummy = ifelse(value - DOB %in% c(19,20), 1, 0)) 

です。

ID YOB VARIABLE VALUE dummy 
    1 1979 ATT94  1994 1 
    1 1979 ATT96  1996 1 
    1 1979 ATT98  0  0 
    2 1976 ATT94  0  0 
    2 1976 ATT96  1996 1 
    2 1976 ATT98  1998 1 

つまり、ATT変数が0以外の値を取るときは、19/20歳でなくても、ダミー= 1となります。何が間違っている可能性がある任意のアイデア?自分の携帯電話で

+0

%in%コマンドで奇妙なことが起こっているようです。幸いにも、次のような他のロジックと置き換えるのは簡単です。 DF%>% メルト(ID = "DOB")%>% tbl_df()%>% 変異(ダミー= ifelse(値 - DOB <21&値 - DOB> 18、1、0)) –

+0

それは完璧に動作し、もう一度感謝アンドリュー – Milhouse

+0

喜んで、それがうまくいます。 –

答えて

0

コードの世界へようこそ! Rの構文は(経験豊富なコーダーであっても)扱いにくく、dplyrは独自の癖を付け加えます。まず、データを再現できるように他の人が実行できるコードを提供するために質問するときに便利です。その詳細については、hereをご覧ください。

DOBATTxのすべての可能な値に対して機能するコードを作成しようとしていますか?言い換えれば、ATTから始まるすべての変数がありますか?そのすべてを見たいと思っていますか?その形式はワイドデータと呼ばれ、Rは長いデータではるかに優れています。幸いにも、reshape2パッケージはまさにそうです。以下のコードは、19歳または20歳のときに学校に通っていた人の値が1のdummy変数を作成します。

# Load libraries 
library(dplyr) 
library(reshape2) 

# Create a sample dataset 
ATT94 <- runif(500, min = 0, max = 1) %>% round(digits = 0) 
ATT96 <- runif(500, min = 0, max = 1) %>% round(digits = 0) 
ATT98 <- runif(500, min = 0, max = 1) %>% round(digits = 0) 
DOB <- rnorm(500, mean = 1977, sd = 5) %>% round(digits = 0) 
df <- cbind(DOB, ATT94, ATT96, ATT98) %>% data.frame() 

# Recode ATTx variables with the actual year 
df$ATT94[df$ATT94==1] <- 1994 
df$ATT96[df$ATT96==1] <- 1996 
df$ATT98[df$ATT98==1] <- 1998 

# Melt the data into a long format and perform requested analysis 
df %>% 
    melt(id = "DOB") %>% 
    tbl_df() %>% 
    mutate(dummy = ifelse(value - DOB %in% c(19,20), 1, 0)) 
+1

ええ、私はすべてのDOBのために働く何かを得ようとしていました。私はちょうどこれを通過しているが、これはうまくいくと思うし、reshape2パッケージは本当に便利だと思うが、私はいくつかのダミーを作成する必要があるが、今私はそれらを理解することができるはずです! – Milhouse

+0

素晴らしい!回答が参考になったら、それをあなたの選択として自由に選択してください。そうすれば、質問は他のユーザーに返答されるように見えます。実際のデータセットでコードを実行しようとしているところでどこにでも掛けられたら教えてください。 –

+0

編集をご覧ください! – Milhouse

0

ので、私は今、この権利を確認することはできませんが、試してみてください。

df$dummy[df$DOB==1988 & df$ATT98==1] <- 1 

編集:上記のアプローチは、列を作成しますが、条件が成立しないときには、NAに等しくなります

@ Greg Snowによれば、このアプローチでは、列がすでに作成されていて、最初はゼロに等しいと仮定しています。つまり、あなたのダミー変数を取得するために次の操作を行うことができます。

df$dummy <- rep(0, nrow(df)) 
df$dummy[df$DOB==1988 & df$ATT98==1] <- 1 
0

@Warnerは、変数を作成する方法を示します(あるいは、少なくとも1の仮定は、すでに0に設定されている列です)。もう1つのアプローチは、明示的にダミー変数を作成しないで、モデル構文(あなたが求めたものは本質的に相互作用です)で作成します。回帰を実行している場合は、これはのようになります。

fit <- lm(resp ~ I(DOB==1988):I(ATT98==1), data=df) 

または

fit <- lm(resp ~ I((DOB==1988) & (ATT98==1)), data=df)