2016-07-26 83 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學校表示出勤表示班次)

我試圖創建一個虛擬變量,如果一個人在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,虛擬值= 1,即使它們不是19/20歲。任何想法可能會出錯?

+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包完全可以做到這一點。下面的代碼創建一個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)) 
+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)。另一種方法是不明確地創建一個虛擬變量,但是讓它在模型語法中爲您創建(您要求的基本上是一種交互)。如果運行的迴歸,這將是這樣的:

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

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