2016-10-15 5 views
1

私は現在大きなデータセット(約30k行)を作成していますが、私はhedonic回帰を作成しています。次のステップは、毎週ダミー変数を作成することです。ダミー変数を作成するループ

私のデータは、データが測定された日によって毎週の番号が割り当てられています。 50の異なる週があります(1-52、2つは不明です)。これらの週次番号は、約10 rows,の後に変更されるまで繰り返されますが、新製品カテゴリは対策であるため、繰り返しも繰り返します。データセットには132があり、1つのカテゴリには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 

の一例であり、Iは、それぞれのデータセットを表すために約30K列を有する、50個の列を作りました。ダミー週(したがって列名)と実際の週(元のデータセットの行)が等しいときはいつでも、ダミー週の行に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 
}}}} 

私はしかし、私は私の問題を解決できないよ、それは間違っている知っています。私はこの問題について何か助けていただければ幸いです。

答えて

3

。まず、Weeksfactor列に変換する必要があります。

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

今、私たちはmodel.matrix()を実行することができます:あなたはまた、単にmodel.matrix(~ . + 0 , data = df)を使用することができます

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 

、数値列が自動的に渡されますよう。式の+ 0は、最初のレベルをInterceptに置き換えることを回避します。違いを見るには0せずに実行してみてください。

また、caretパッケージのdummyVarsを使用することもできます。

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 
+0

素敵なアプローチ:ここでは、なしInterceptはデフォルトの動作です!この 'model.matrix'関数についてはわかりませんでした – h3rm4n

+0

Thx、それは私のデータセットの残りの部分ではうまくいきました。あなたはそれがどのように働くかをもう少し説明できますか? Rのヘルプはそれほど単純ではありませんでした。 –

+0

何がお手伝いしますか? – mtoto

0

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)) 

結果:私たちはあなたのデータをdummifyするstatsパッケージからmodel.matrix()を使用することができます

> 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 
関連する問題