2016-07-26 5 views
2

Мой набор данных выглядит что-то вроде этогоСоздание фиктивной переменной со многими условиями (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 ...... 

(с ATTXX фиктивной вар. Обозначая присутствие в школе в год XX, GRADEXX обозначая классов школы)

Я пытаюсь создать фиктивную переменную, которая = 1, если человек посещает школу, когда им исполняется 19/20 лет. например если YOB = 1988 и ATT98 = 1, то новая переменная = 1 и т. д. Я пытаюсь использовать это с помощью mutate в dplyr, но я новичок в R (и кодировании вообще!), поэтому стараюсь получить что-либо кроме ошибки код пишу.

Любая помощь будет оценена, спасибо.

Edit:

Итак, я только что заметил, что что-то пошло не так, я изменил код немного просто добавить еще один столбец в таблице данных длинный формат. Вот что я сделал в конце:

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 манекена = 1, даже если они не 19/20 лет. Любые идеи, что может пойти не так?

+0

Кажется, что что-то странное происходит с командой% in%. К счастью, это легко заменить другой логикой, например, следующим. ДФ%>% расплава (ID = "DOB")%>% tbl_df()%>% мутируют (фиктивная = IfElse (значение - DOB <21 & значение - DOB> 18, 1, 0)) –

+0

что отлично работает, спасибо снова Andrew – Milhouse

+0

Счастлив помочь, рад, что он работает. –

ответ

0

Добро пожаловать в мир кода! Синтаксис R может быть сложным (даже для опытных кодеров), а dplyr добавляет свои собственные причуды. Во-первых, полезно, когда вы задаете вопросы, чтобы предоставить код, который могут выполнять другие люди, чтобы иметь возможность воспроизводить ваши данные. Вы можете узнать больше об этом here.

Вы пытаетесь создать код, который работает для всех возможных значений DOB и ATTx? Другими словами, у вас есть целая куча переменных, которые начинаются с ATT, и вы хотите посмотреть на них все? Этот формат называется широкими данными, а R работает намного лучше с длинными данными. К счастью, пакет reshape2 выполняет именно это. В приведенном ниже коде создается переменная dummy со значением 1 для людей, которые были в школе, когда им было 19 или 20 лет.

# 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 

Edit: выше подход создает столбец, но когда условие не выполняется, это будет равно NA

Как упоминает @Greg Snow, этот подход предполагает, что столбец уже создан и первоначально равен нулю. Таким образом, вы можете сделать следующее, чтобы получить фиктивную переменную:

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

@Warner показывает способ создания переменной (или, по крайней мере, 1 в предположение столбец уже установлен в 0). Другой подход заключается в том, чтобы явно не создавать фиктивную переменную, но она была создана для вас в синтаксисе модели (то, что вы просили, по сути, является взаимодействием). При работе регрессии, то это будет что-то вроде:

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

или

fit <- lm(resp ~ I((DOB==1988) & (ATT98==1)), data=df) 
Смежные вопросы