2016-11-04 4 views
-1

upSetRパッケージで試したい離散選択データがありますが、データを使用可能な形式にする方法がわかりません。すべての可能な選択肢のバイナリ変数のセット。離散選択データをバイナリインジケータに変換する方法

サブセット{1,2,3}、{4,5}、{6,7}、... {19,20}の要素の中で、c1:c8の8つの選択肢のセットに関する4591回の観測から成ります。 。 data.frame doorsはこのように見え、[https://www.dropbox.com/s/8iffufkt3iz6guf/doors.csv?raw=1はここにあります]。

> doors <- read.csv("https://www.dropbox.com/s/8iffufkt3iz6guf/doors.csv?raw=1", 
        row.names=1, stringsAsFactors=FALSE) 
> doors$date <- as.POSIXct(doors$date) 

> doors[sample(1:nrow(doors), 15), 1:8 ] 
    c1 c2 c3 c4 c5 c6 c7 c8 
3038 2 4 6 9 11 14 16 20 
2021 2 4 7 NA 11 14 16 20 
3482 2 4 7 9 13 14 17 20 
4779 2 4 6 9 11 14 16 19 
3922 1 NA NA NA 11 15 NA NA 
1726 2 5 NA NA 11 15 NA 20 
4659 2 4 6 9 11 14 16 NA 
1267 3 4 6 9 13 14 17 20 
3916 2 5 7 9 13 14 16 19 
5132 3 4 6 9 13 15 16 19 
1846 2 4 6 NA 11 NA 16 20 
1768 3 5 6 NA 13 14 16 20 
3833 2 4 6 NA 13 14 16 19 
1610 2 4 6 9 11 NA 16 19 
4290 1 5 6 10 13 14 18 19 
> 

は、私は、各 観察のため、d[i] = 1i場合は、どこかの変数c1:c8内に含まれているバイナリ変数、d1:d20doorsデータフレームにc1:c8を変換したいです。これどうやってするの?

これを理解することができれば、以下の表は、選択変数(私が持っているもの)とバイナリ変数(私が望むもの)の関係を示しています。

> tab <- table(stack(doors[,1:8])) 
> names(dimnames(tab)) <- c("door", "choice") 
> rownames(tab) <- paste0("d", 1:20) 
> tab 
    choice 
door c1 c2 c3 c4 c5 c6 c7 c8 
    d1 382 0 0 0 0 0 0 0 
    d2 2193 0 0 0 0 0 0 0 
    d3 2016 0 0 0 0 0 0 0 
    d4  0 2843 0 0 0 0 0 0 
    d5  0 1155 0 0 0 0 0 0 
    d6  0 0 2607 0 0 0 0 0 
    d7  0 0 1349 0 0 0 0 0 
    d8  0 0 0 654 0 0 0 0 
    d9  0 0 0 2174 0 0 0 0 
    d10 0 0 0 197 0 0 0 0 
    d11 0 0 0 0 2093 0 0 0 
    d12 0 0 0 0 367 0 0 0 
    d13 0 0 0 0 1585 0 0 0 
    d14 0 0 0 0 0 2449 0 0 
    d15 0 0 0 0 0 1466 0 0 
    d16 0 0 0 0 0 0 3004 0 
    d17 0 0 0 0 0 0 354 0 
    d18 0 0 0 0 0 0 591 0 
    d19 0 0 0 0 0 0 0 1581 
    d20 0 0 0 0 0 0 0 2092 
> 

答えて

1

これはあなたが何をしているのかと思います。 applyを使用して、各行で特定の番号を検索します。 lapplyの呼び出しでそれをラップすると、1から20までのシーケンスで反復処理されます。 Reduce(cbind)as.data.frameを使用して、生成されたリストをデータフレームにまとめる。そのデータフレームの列に素敵な名前を付けます。 applyの呼び出しでは、を使用して、その行の任意の場所に値iが表示されるかどうかを示すダミー変数を取得できます。ここで

df <- lapply(seq(20), function(i) apply(doors[,1:8], 1, function(x) as.numeric(any(x == i, na.rm = TRUE)))) 
df <- Reduce(cbind, df) 
df <- as.data.frame(df) 
names(df) <- paste0("d", seq(20)) 

結果の最初の数行です:

多かれ少なかれ作品
> head(df) 
    d1 d2 d3 d4 d5 d6 d7 d8 d9 d10 d11 d12 d13 d14 d15 d16 d17 d18 d19 d20 
758 0 1 0 0 0 0 0 0 0 0 1 0 0 1 0 1 0 0 1 0 
759 0 1 0 0 0 0 0 0 0 0 1 0 0 1 0 1 0 0 1 0 
760 0 1 0 0 0 0 0 0 0 0 1 0 0 0 1 1 0 0 1 0 
761 0 1 0 0 0 0 0 0 0 0 1 0 0 1 0 1 0 0 1 0 
762 0 0 1 0 0 0 0 0 0 0 0 0 1 1 0 1 0 0 1 0 
763 0 0 1 0 0 0 0 0 0 0 0 0 1 0 1 1 0 0 0 1 
+0

、私の 'doors'データは、同様に日付の列を持っているので、私は' ddの上でこれを使う以外< - doors [、1:8] 'と私のデータセット。 – user101089

+0

この場合、値1:20は日付列のどこにも表示されないため、 'doors [、1:8]'は必要ありません。しかし、ええ、操作を関連する列だけに制限することは、おそらく良い考えです。 – ulfelder

関連する問題