虚拟变量基于不同列中的值

时间:2018-06-20 16:51:04

标签: r dplyr tidyr

我目前有一个看起来像这样的数据框:

dat2<-data.frame(
ID=c(100,101,102,103),
DEGREE_1=c("BA","BA","BA","BA"),
DEGREE_2=c(NA,"BA",NA,NA),
DEGREE_3=c(NA,"MS",NA,NA),
YEAR_DEGREE_1=c(1980,1990,2000,2004),
YEAR_DEGREE_2=c(NA,1992,NA,NA),
YEAR_DEGREE_3=c(NA,1996,NA,NA)
)

  ID DEGREE_1 DEGREE_2 DEGREE_3 YEAR_DEGREE_1 YEAR_DEGREE_2 YEAR_DEGREE_3
  100   BA      <NA>     <NA>       1980            NA            NA
  101   BA       BA       MS        1990          1992          1996
  102   BA      <NA>     <NA>       2000            NA            NA
  103   BA      <NA>     <NA>       2004            NA            NA

我想基于获得的学位程度来创建编码为0/1的伪变量,以一个BA学位的完成为基础。

完成的数据帧将具有第二个BA度虚拟度,一个MS度虚拟度,依此类推。例如,对于ID 101,两个虚拟变量的值都将为1。完成两个MS度的操作将不需要虚拟,即,如果某人完成了两个MS度的操作,则MS度的虚拟度将为1,并且没有虚拟度。表示完成两个MS学位。

Like such

这是一个更大的数据帧的简单快照,该数据帧除了BA和MS之外还具有许多不同的度类型,因此对于每个单度类型创建if / else语句对我来说都不理想。

任何建议将不胜感激。

1 个答案:

答案 0 :(得分:1)

您还可以包括新列,并根据DEGREE列分配值。

包括新列,所有值均等于0:

dat2 <- cbind(dat2, BA_2nd = 0)
dat2 <- cbind(dat2, MS = 0)

根据您的条件将值更改为1:

dat2[!is.na(dat2$DEGREE_2), 8] <- 1
dat2[!is.na(dat2$DEGREE_3) & dat2$DEGREE_3 == "MS", 9] <- 1
dat2

您可以使其适应所有条件。该代码仅生成您包含的输出表。