簡體   English   中英

循環創建虛擬變量

[英]Loop to create dummy variables

我目前正在研究一個大型數據集(大約30k行),而我正致力於創建一個hedonic回歸。 下一步是創建每周虛擬變量。

現在,我的數據已根據測量數據的日期分配了每周數量。 有50個不同的星期(1-52,2失蹤下落不明)。 這些每周數字會重復,直到大約10 rows,之后的變化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行來表示數據集。 每當假周(因此列名稱)和實際周(orig。數據集的行)相等時,我想將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
}}}}

我知道這是錯的,但是我無法解決我的問題。 在這件事情上,我將不勝感激。

我們可以使用stats包中的model.matrix()來對stats進行虛假化處理。 首先,我們需要將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 這里, 沒有 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

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM