[英]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.