循环创建虚拟变量

Chr*_* P. 3 loops regression r dataset

我目前正在处理一个大型数据集(约 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
Run Code Online (Sandbox Code Playgroud)

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

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

DW1 DW2 
NA  NA
NA  NA
NA  NA
Run Code Online (Sandbox Code Playgroud)

我尝试了以下方法:

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
}}}}
Run Code Online (Sandbox Code Playgroud)

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

mto*_*oto 6

我们可以使用包model.matrix()中的stats内容来模拟您的数据。首先,我们需要转换Weeksfactor列。

df$Weeks <- as.factor(df$Weeks)
Run Code Online (Sandbox Code Playgroud)

现在我们可以运行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
Run Code Online (Sandbox Code Playgroud)

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

或者,您也可以使用包装dummyVars中的caret产品。在这里,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
Run Code Online (Sandbox Code Playgroud)