整数の入った列を横展開して1,0に変換したい


以下のようなデータフレームdfがあるのですが、

[code]

    id category
    1   3
    2   2
    3   3
    4   1
    5   2
    6   2
    
[/code]

これを

[code]

    id category1 category2 category3
    1   0         0         1
    2   0         1         0
    3   0         0         1
    4   1         0         0
    5   0         1         0
    6   0         1         0
    
[/code]

のような形にしたいと考えています。  
現在はこれを

[code]

    df <- tidyr::spread(df,category,category) #横展開
    df.id <- df[,1] #そのままやるとid列も1になってしまうため分離
    df.other <- df[,-1]
    df.other[!is.na(df.other)] <- 1
    df.other[is.na(df.other)] <- 0
    df <- cbind(df.id,df.other)
    
[/code]

としているのですが、もう少しスマートな方法はないでしょうか？  
どなたかご教授お願い致します。




スマートかどうかは分かりませんが、、以下は `apply` を使う場合です。

[code]

    > df[paste('category', sort(unique(df$category)), sep='')] <- 0
    > data.frame(t(apply(df, 1,
        function(r){
          r[paste('category', r['category'], sep='')] <- 1
          r[-c(2)]
        })))
    
      id category1 category2 category3
    1  1         0         0         1
    2  2         0         1         0
    3  3         0         0         1
    4  4         1         0         0
    5  5         0         1         0
    6  6         0         1         0
    
[/code]

`apply(df, 1, ...)` とすることでデータフレームを行ごとに処理します。また、`r[-c(2)]` でデータフレームの `category`
カラムを削除しています。

