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 以外的值时,虚拟 = 1,即使它们不是 19/20 岁。有什么想法可能会出错吗?

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

欢迎来到代码世界!R 的语法可能很棘手(即使对于有经验的编码人员)并dplyr添加了自己的怪癖。首先,当您提出问题以提供其他人可以运行的代码以便能够重现您的数据时,它很有用。您可以在此处了解更多信息。

您是否正在尝试创建适用于 和 的所有可能值的DOB代码ATTx?换句话说,您是否有一大堆以 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 回答
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)
于 2016-07-26T17:19:46.827 回答