【问题标题】:Loop to create dummy variables循环创建虚拟变量
【发布时间】:2017-02-24 19:59:44
【问题描述】:

我目前正在处理一个大型数据集(大约 30k 行),并且正在创建一个 hedonic 回归。下一步是创建每周虚拟变量。

现在我的数据根据​​测量数据的日期分配了每周编号。有 50 个不同的周(1-52,2 个失踪未计)。这些每周数字会重复,直到大约10 rows, 之后发生变化,但它们也会重复出现,因为新产品类别是衡量标准。数据集中有 132 个可用,一个类别包含在 100 - 300 rows 之间。

这是数据集的示例

UPC         Weeks
1111112016  1
1111112016  1
1111112016  2
1111112016  2
1111112016  3
1111112016  3
1111112440  1
1111112440  1
1111112440  2
1111112440  2
1111112440  3
1111112440  3

现在要创建虚拟变量,我创建了 50 列,每列大约有 30k 行来表示数据集。每当虚拟周(因此列名)和实际周(原始数据集的行)相等时,我想将 1 分配给虚拟周的行。

示例虚拟(DW = 虚拟周):

DW1 DW2 
NA  NA
NA  NA
NA  NA

我尝试了以下方法:

for (i in 1:seq(Soap$WEEK)){
if Soap$WEEK[i] == seq(from=1, by=1, to=52){
for (j in names(x)){
x$DW[[j]] = 1
else {
  x$DW[[j]] = 0
}}}}

我知道这是错误的,但是我无法解决我的问题。在这件事上我将不胜感激。

【问题讨论】:

    标签: r loops dataset regression


    【解决方案1】:

    我们可以使用stats 包中的model.matrix() 来虚拟化您的数据。首先,我们需要将Weeks 转换为factor 列。

    df$Weeks <- as.factor(df$Weeks)
    

    现在我们可以运行model.matrix():

    model.matrix(~ Weeks + UPC + 0, data = df)
    #   Weeks1 Weeks2 Weeks3        UPC
    #1       1      0      0 1111112016
    #2       1      0      0 1111112016
    #3       0      1      0 1111112016
    #4       0      1      0 1111112016
    #5       0      0      1 1111112016
    #6       0      0      1 1111112016
    #7       1      0      0 1111112440
    #8       1      0      0 1111112440
    #9       0      1      0 1111112440
    #10      0      1      0 1111112440
    #11      0      0      1 1111112440
    #12      0      0      1 1111112440
    

    您也可以只使用model.matrix(~ . + 0 , data = df),因为数字列将被自动传递。公式中的+ 0 避免将第一级替换为Intercept。要查看差异,请尝试在不使用 0 的情况下运行它。

    或者,您也可以使用caret 包中的dummyVars。这里,no Intercept 是默认行为:

    library(caret)
    
    dm <- dummyVars(" ~ .", data = df)
    data.frame(predict(dm, newdata = df))
    #          UPC Weeks.1 Weeks.2 Weeks.3
    #1  1111112016       1       0       0
    #2  1111112016       1       0       0
    #3  1111112016       0       1       0
    #4  1111112016       0       1       0
    #5  1111112016       0       0       1
    #6  1111112016       0       0       1
    #7  1111112440       1       0       0
    #8  1111112440       1       0       0
    #9  1111112440       0       1       0
    #10 1111112440       0       1       0
    #11 1111112440       0       0       1
    #12 1111112440       0       0       1
    

    【讨论】:

    • 不错的方法!不知道这个model.matrix 函数
    • 谢谢,这对我的其余数据集非常有效。你能解释一下它是如何工作的吗? R 的帮助并不是那么直接。
    • 您需要什么帮助?
    • 我只是想要更多代码的作用。两者只是创建0和1吗?
    【解决方案2】:

    您可以通过使用sapply 并将Weeks 列的值与您可以使用substr 提取的虚拟列名称的数字部分进行比较来解决此问题。

    在您的示例数据集上:

    # create the dummy columns and fill them with NA's
    dat[, paste0('DW', 1:3)] <- NA
    
    # compare the values in 'Weeks' with the numeric part of the column names
    dat[, 3:5] <- sapply(names(dat)[3:5], function(x) as.integer(substr(x,3,3) == dat$Weeks))
    

    结果:

    > dat
              UPC Weeks DW1 DW2 DW3
    1  1111112016     1   1   0   0
    2  1111112016     1   1   0   0
    3  1111112016     2   0   1   0
    4  1111112016     2   0   1   0
    5  1111112016     3   0   0   1
    6  1111112016     3   0   0   1
    7  1111112440     1   1   0   0
    8  1111112440     1   1   0   0
    9  1111112440     2   0   1   0
    10 1111112440     2   0   1   0
    11 1111112440     3   0   0   1
    12 1111112440     3   0   0   1
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-08-03
      • 2018-03-31
      • 2016-04-24
      • 2023-03-27
      • 2022-11-10
      • 2021-07-20
      • 2020-04-04
      • 2018-04-06
      相关资源
      最近更新 更多