如何创建虚拟变量?

时间:2012-10-06 08:23:02

标签: r

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

 $ year           : Factor w/ 8 levels "2003","2004",..: 4 6 4 2 4 1 3 3 7 2 ...

我想创建8个虚拟变量,名为“2003”,“2004”等取值为0或1,具体取决于变量“year”的值。我能想出的最近的是

dt1 <- cbind (dt1, model.matrix(~dt1$year - 1) )

但这会产生不幸的后果

  1. 虚拟变量名为dt1 $ year2003,而不只是“2003”,“2004”等
  2. 似乎model.matrix完全省略了NA行(因此,当year变量中存在NA时,由于长度不同,上述命令失败。
  3. 当然,我可以用更多的代码解决这些问题,但我喜欢我的代码尽可能简洁(在合理范围内),所以如果有人能提出更好的方法来制作虚拟变量,我将不得不承担。

3 个答案:

答案 0 :(得分:2)

您可以使用不会遗漏ifelse()行的na(但我想您可能不会将其视为“尽可能简洁”):

dt1 <- data.frame(year=factor(rep(2003:2010, 10)))  # example data

dt1 <- within(dt1, yr2003<-ifelse(year=="2003", 1, 0))
dt1 <- within(dt1, yr2004<-ifelse(year=="2004", 1, 0))
dt1 <- within(dt1, yr2005<-ifelse(year=="2005", 1, 0))
# ...    

head(dt1)
#   year yr2003 yr2004 yr2005
# 1 2003      1      0      0
# 2 2004      0      1      0
# 3 2005      0      0      1
# 4 2006      0      0      0
# 5 2007      0      0      0
# 6 2008      0      0      0

答案 1 :(得分: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)))

如上所述,在某些情况下,如果列名不是合法的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

答案 2 :(得分:1)

library(caret)提供了一个非常简单的函数(dummyVars)来创建虚拟变量,尤其是当您有多个因子变量时。但是你必须确保目标变量是因子。例如如果您的Sales$year是数字,则必须将其转换为系数:as.factor(Sales$year)

假设我们有原始数据集'Sales',如下所示:

    year    Sales       Region
1   2010    3695.543    North
2   2010    9873.037    West
3   2008    3579.458    West
4   2005    2788.857    North
5   2005    2952.183    North
6   2008    7255.337    West
7   2005    5237.081    West
8   2010    8987.096    North
9   2008    5545.343    North
10  2008    1809.446    West

现在我们可以同时创建两个虚拟变量:

>library(lattice)
>library(ggplot2)
>library(caret)
>Salesdummy <- dummyVars(~., data = Sales, levelsOnly = TRUE)
>Sdummy <- predict(Salesdummy, Sales)

结果将是:

   2005 2008 2010   Sales    RegionNorth    RegionWest
1   0    0    1   3695.543       1              0
2   0    0    1   9873.037       0              1
3   0    1    0   3579.458       0              1
4   1    0    0   2788.857       1              0
5   1    0    0   2952.183       1              0
6   0    1    0   7255.337       0              1
7   1    0    0   5237.081       0              1
8   0    0    1   8987.096       1              0
9   0    1    0   5545.343       1              0 
10  0    1    0   1809.446       0              1