如何创建虚拟变量?

Joe*_*ing 5 r

我有一个变量是一个因素:

 $ year           : Factor w/ 8 levels "2003","2004",..: 4 6 4 2 4 1 3 3 7 2 ...
Run Code Online (Sandbox Code Playgroud)

我想创建8个虚拟变量,名为"2003","2004"等取值为0或1取决于变量"year"的值.我能想到的最近的是

dt1 <- cbind (dt1, model.matrix(~dt1$year - 1) )
Run Code Online (Sandbox Code Playgroud)

但这带来了不幸的后果

  1. 虚拟变量名为dt1 $ year2003,而不仅仅是"2003","2004"等
  2. 似乎NA行完全被省略model.matrix(因此当year变量中存在NA时,由于不同的长度,上述命令失败).

当然,我可以用更多的代码解决这些问题,但我喜欢我的代码尽可能简洁(在合理范围内),所以如果有人能提出更好的方法来制作虚拟变量,我将不得不这样做.

Ben*_*ker 2

这是我所能得到的最简洁的。该na.action选项负责处理NA值(我宁愿使用参数来执行此操作,而不是使用全局选项设置,但我不知道如何执行此操作)。列的命名是相当深入的硬编码,看不到任何方法来覆盖它model.matrix......

options(na.action=na.pass)
dt1 <- data.frame(year=factor(c(NA,2003:2005)))
dt2 <- setNames(cbind(dt1,model.matrix(~year-1,data=dt1)),
              c("year",levels(dt1$year)))
Run Code Online (Sandbox Code Playgroud)

如上所述,在某些上下文中,如果列名不是合法的 R 变量名,您可能会遇到麻烦。

  year 2003 2004 2005
1 <NA>   NA   NA   NA
2 2003    1    0    0
3 2004    0    1    0
4 2005    0    0    1
Run Code Online (Sandbox Code Playgroud)