2016-07-26 82 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)