【问题标题】:Creating dummy variables in r statistical programming在 r 统计编程中创建虚拟变量
【发布时间】:2020-04-06 16:21:03
【问题描述】:

我对 R 统计编程相当陌生,并且在创建虚拟变量以重新编码一列数据时遇到了一些问题。下面是数据集的一个sn-p:

年季度销售额 GNP 2002 1 696048 9740.5 2002 2 753211 9983.5 2002 3 746875 10048.0 2002 4 792622 10184.9 2003 1 704757 10206.2 2003 2 779011 10350.9 2003 3 756128 10332.2 2003 4 827829 10463.1

我尝试创建的三个新列是 d1、d2 和 d3。 d1 是一个虚拟变量,如果第 1 季度为 1,否则为 0,d2 是一个虚拟变量,如果第 2 季度为 1,否则为 0,d3 是一个虚拟变量,如果第 3 季度为 1,否则为 0。

我正在使用以下 R 代码来尝试完成此操作:

d1 <- ifelse(Quarter == 1, 1, 0)
Retail_Sales_vs_GNP <- data.frame(Retail_Sales_vs_GNP, d1)
d2 <- ifelse(Quarter == 2, 1, 0)
Retail_Sales_vs_GNP <- data.frame(Retail_Sales_vs_GNP, d2)
d3 <- ifelse(Quarter == 3, 1, 0)
Retail_Sales_vs_GNP <- data.frame(Retail_Sales_vs_GNP, d3)

但是,当我查看新列时,所有值都等于 0?如果第 1 季度,d1 应该等于 1,但它等于 0。我的代码的哪一部分需要修改才能完成?

【问题讨论】:

  • 能不能秀一下你的预期
  • 抱歉,由于某种原因我无法发布图片。但是预期的结果应该是这样的:d1 1 0 0 0 1 0 0 0 d2 0 1 0 0 0 1 0 0 d3 0 0 1 0 0 0 1 0
  • 根据您的示例和描述,我发布了一个解决方案。请检查

标签: r


【解决方案1】:

我们可以使用model.matrx

df1[paste0('dummy_cols', 1:4)] <- model.matrix(~ factor(df1$Quarter)-1)
df1
# Year Quarter  Sales     GNP dummy_cols1 dummy_cols2 dummy_cols3 dummy_cols4
#1 2002       1 696048  9740.5           1           0           0           0
#2 2002       2 753211  9983.5           0           1           0           0
#3 2002       3 746875 10048.0           0           0           1           0
#4 2002       4 792622 10184.9           0           0           0           1
#5 2003       1 704757 10206.2           1           0           0           0
#6 2003       2 779011 10350.9           0           1           0           0
#7 2003       3 756128 10332.2           0           0           1           0
#8 2003       4 827829 10463.1           0           0           0           1

数据

df1 <- structure(list(Year = c(2002L, 2002L, 2002L, 2002L, 2003L, 2003L, 
2003L, 2003L), Quarter = c(1L, 2L, 3L, 4L, 1L, 2L, 3L, 4L), Sales = c(696048L, 
753211L, 746875L, 792622L, 704757L, 779011L, 756128L, 827829L
), GNP = c(9740.5, 9983.5, 10048, 10184.9, 10206.2, 10350.9, 
10332.2, 10463.1)), class = "data.frame", row.names = c(NA, -8L
))

【讨论】:

    【解决方案2】:

    通常在 R 中构建线性模型时,您不必自己构建模型矩阵。相反,您可以将 Quarter 指定为一个因素,lm 将为您生成模型矩阵。这里有两种方法。我们已经展示了模型矩阵,因此您可以看到它的样子,但除此之外您可能不需要显式生成它。

    (以下输出的属性部分已被省略以保持演示更短。)

    # test data
    Quarter <- c(1, 1, 2, 2, 3, 3, 4, 4); Sales <- 1:8
    
    Qtr <- factor(Quarter)
    fm <- lm(Sales ~ Qtr + 0)
    
    model.matrix(fm)
    ##   Qtr1 Qtr2 Qtr3 Qtr4
    ## 1    1    0    0    0
    ## 2    1    0    0    0
    ## 3    0    1    0    0
    ## 4    0    1    0    0
    ## 5    0    0    1    0
    ## 6    0    0    1    0
    ## 7    0    0    0    1
    ## 8    0    0    0    1
    
    Qtr <- relevel(factor(Quarter), 4)
    fm2 <- lm(Sales ~ Qtr)
    model.matrix(fm2)
    ##   (Intercept) Qtr1 Qtr2 Qtr3
    ## 1           1    1    0    0
    ## 2           1    1    0    0
    ## 3           1    0    1    0
    ## 4           1    0    1    0
    ## 5           1    0    0    1
    ## 6           1    0    0    1
    ## 7           1    0    0    0
    ## 8           1    0    0    0
    

    【讨论】:

      猜你喜欢
      • 2023-03-24
      • 2013-09-23
      • 1970-01-01
      • 2018-09-16
      • 1970-01-01
      • 2018-07-20
      • 2020-04-03
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多