5

私は要因である変数を持っています:

 $ year           : Factor w/ 8 levels "2003","2004",..: 4 6 4 2 4 1 3 3 7 2 ...

変数「year」が取る値に応じて値0または1をとる、「2003」、「2004」などの名前の8つのダミー変数を作成したいと思います。私が思いつくことができる最も近いものは

dt1 <- cbind (dt1, model.matrix(~dt1$year - 1) )

しかし、これは不幸な結果をもたらします

  1. ダミー変数の名前は、「2003」、「2004」などだけでなく、dt1$year2003です。
  2. NA行はによって完全に省略されているようですmodel.matrix(したがって、NAが変数に存在する場合、長さが異なるため、上記のコマンドは失敗しyearます)。

もちろん、より多くのコードでこれらの問題を回避することはできますが、(理由の範囲内で)コードをできるだけ簡潔にするのが好きなので、ダミー変数を作成するためのより良い方法を誰かが提案できれば、私は義務付けられます。

4

3 に答える 3

2

ifelse()行を省略しないものを使用できますna(ただし、「できるだけ簡潔」であるとは見なされない可能性があります)。

dt1 <- data.frame(year=factor(rep(2003:2010, 10)))  # example data

dt1 <- within(dt1, yr2003<-ifelse(year=="2003", 1, 0))
dt1 <- within(dt1, yr2004<-ifelse(year=="2004", 1, 0))
dt1 <- within(dt1, yr2005<-ifelse(year=="2005", 1, 0))
# ...    

head(dt1)
#   year yr2003 yr2004 yr2005
# 1 2003      1      0      0
# 2 2004      0      1      0
# 3 2005      0      0      1
# 4 2006      0      0      0
# 5 2007      0      0      0
# 6 2008      0      0      0
于 2012-10-06T10:37:20.833 に答える
2

これは私が得ることができる限り簡潔です。na.actionオプションが値を処理します(グローバルオプション設定よりも引数を使用してこれを実行したいのNAですが、方法がわかりません)。model.matrix列の名前はかなり深くハードコーディングされており、 ...内でそれをオーバーライドする方法はありません。

options(na.action=na.pass)
dt1 <- data.frame(year=factor(c(NA,2003:2005)))
dt2 <- setNames(cbind(dt1,model.matrix(~year-1,data=dt1)),
              c("year",levels(dt1$year)))

上で指摘したように、正当なR変数名ではない列名を使用するコンテキストでは、問題が発生する可能性があります。

  year 2003 2004 2005
1 <NA>   NA   NA   NA
2 2003    1    0    0
3 2004    0    1    0
4 2005    0    0    1
于 2012-10-06T13:54:18.450 に答える
1

library(caret)dummyVars特に複数の因子変数がある場合に、ダミー変数を作成するため の非常に単純な関数()を提供します。ただし、ターゲット変数が因子であることを確認する必要があります。たとえば、Sales$year数値の場合は、それらを因数分解に変換する必要があります。as.factor(Sales$year)

次のように元のデータセット「Sales」があるとします。

    year    Sales       Region
1   2010    3695.543    North
2   2010    9873.037    West
3   2008    3579.458    West
4   2005    2788.857    North
5   2005    2952.183    North
6   2008    7255.337    West
7   2005    5237.081    West
8   2010    8987.096    North
9   2008    5545.343    North
10  2008    1809.446    West

これで、2つのダミー変数を同時に作成できます。

>library(lattice)
>library(ggplot2)
>library(caret)
>Salesdummy <- dummyVars(~., data = Sales, levelsOnly = TRUE)
>Sdummy <- predict(Salesdummy, Sales)

結果は次のようになります。

   2005 2008 2010   Sales    RegionNorth    RegionWest
1   0    0    1   3695.543       1              0
2   0    0    1   9873.037       0              1
3   0    1    0   3579.458       0              1
4   1    0    0   2788.857       1              0
5   1    0    0   2952.183       1              0
6   0    1    0   7255.337       0              1
7   1    0    0   5237.081       0              1
8   0    0    1   8987.096       1              0
9   0    1    0   5545.343       1              0 
10  0    1    0   1809.446       0              1
于 2014-04-22T09:06:43.837 に答える