【问题标题】:How to create dummy variables?如何创建虚拟变量?
【发布时间】:2012-09-27 07:23:10
【问题描述】:

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

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

我想创建 8 个虚拟变量,命名为“2003”、“2004”等,根据变量“year”的值取值 0 或 1。我能想到的最接近的是

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

但这会带来不幸的后果

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

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

【问题讨论】:

  • 我认为你不能在R:cran.r-project.org/doc/manuals/…中拥有以数字开头的变量名
  • 通常情况下,您不会自己创建一个假人,而是在模型中使用类“因子”的变量,因此适合模型的函数将从因子构造模型矩阵。如果您需要它们,您可以从模型矩阵中提取假人。
  • @Glen_b 谢谢 - 这是有用的信息,这意味着我可以运行一个模型,例如 glmer(y~x + (year + 1|school).... where year 而不是编码虚拟变量并运行 glmer(y~x + (y1+y2+y3+y4+y5+y6+y7+y8 + 1|school).... 并获得相同的输出?
  • 治疗对比是 R 中分类变量的默认设置。
  • @smillig:在 R 中,变量名可以以数字和下划线开头,但应适当引用。

标签: r


【解决方案1】:

您可以使用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

【讨论】:

    【解决方案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
    

    【讨论】:

      【解决方案3】:

      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
      

      【讨论】:

        猜你喜欢
        • 2023-03-27
        • 2018-04-06
        • 2020-01-31
        • 1970-01-01
        • 1970-01-01
        • 2017-02-24
        • 2023-03-14
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多