2

私のデータセットは次のようになります

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  ......

(ATTXX は XX 年の学校への出席を示すダミー変数、GRADEXX は学年を示す)

個人が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 になります。何がうまくいかないのでしょうか?

4

3 に答える 3

1

携帯電話なので今は確認できませんが、試してみてください:

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
于 2016-07-26T17:11:42.623 に答える
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)
于 2016-07-26T17:19:46.827 に答える
0

コードの世界へようこそ!R の構文は (経験豊富なコーダーにとっても) トリッキーでありdplyr、独自の癖が追加されています。まず、データを再現できるようにするために他の人が実行できるコードを提供する質問をするときに役立ちます。詳細については、こちらをご覧ください。

と のすべての可能な値に対して機能するコードを作成しようとしていますDOBATTx? つまり、ATT で始まる変数がたくさんあり、それらすべてを確認したいですか? その形式はワイド データと呼ばれ、R はロング データでより適切に機能します。幸いなことに、reshape2パッケージはまさにそれを行います。以下のコードdummyは、19 歳または 20 歳のときに学校に通っていた人々の値が 1 の変数を作成します。

# 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))
于 2016-07-26T17:35:55.973 に答える