2012-02-02 19 views
2

データセット内の欠落した観測のすべての固有パターンを特定する方法を決定しました。ここでは、欠落した観測のパターンでそのデータセットのすべての行を選択したいと思います。これを繰り返し実行して、データセットにnパターンの欠落した観測がある場合、欠落した観測のパターンが1つしかないn個のデータセットで終了するようにします。Rを使用して、欠落した観測値が一致するデータセットの行を選択します。

私はこれを行う方法を知っていますが、私の方法はあまり効率的ではなく、一般的ではありません。私は実際のデータセットが以下の例よりはるかに大きく変動するので、より効率的でより一般的なアプローチを学びたいと思っています。

ここでは、使用しているデータセットとコードの例を示します。行列dzzから行列zzzを作成するために使用したコードを含めても構いませんが、そのコードがあれば追加できます。この例では

dd <- matrix(c( 
      1, 0, 1, 1, 
      NA, 1, 1, 0, 
      NA, 0, 0, 0, 
      NA, 1,NA, 1, 
      NA, 1, 1, 1, 
      0, 0, 1, 0, 
      NA, 0, 0, 0, 
      0,NA,NA,NA, 
      1,NA,NA,NA, 
      1, 1, 1, 1, 
      NA, 1, 1, 0), 
nrow=11, byrow=T) 

zzz <- matrix(c(
      1, 1, 1, 1, 
      NA, 1, 1, 1, 
      NA, 1,NA, 1, 
      1,NA,NA,NA 
), nrow=4, byrow=T) 

for(jj in 1:dim(zzz)[1]) { 
ddd <- 
dd[ 
((dd[, 1]%in%c(0,1) & zzz[jj, 1]%in%c(0,1)) | 
    (is.na(dd[, 1]) & is.na(zzz[jj, 1]))) & 
((dd[, 2]%in%c(0,1) & zzz[jj, 2]%in%c(0,1)) | 
(is.na(dd[, 2]) & is.na(zzz[jj, 2]))) & 
((dd[, 3]%in%c(0,1) & zzz[jj, 3]%in%c(0,1)) | 
(is.na(dd[, 3]) & is.na(zzz[jj, 3]))) & 
((dd[, 4]%in%c(0,1) & zzz[jj, 4]%in%c(0,1)) | 
(is.na(dd[, 4]) & is.na(zzz[jj, 4]))),] 

print(ddd) 
} 

4結果のデータセットは以下のとおりです。

a) 
1 0 1 1 
0 0 1 0 
1 1 1 1 

b) 
NA 1 1 0 
NA 0 0 0 
NA 1 1 1 
NA 0 0 0 
NA 1 1 0 

c) 
NA 1 NA 1 

d) 
0 NA NA NA 
1 NA NA NA 

同じことをやってのより一般的でより効率的な方法はありますか?上記の例では、4つのデータセットは保存されませんが、実際のデータで保存します。

ありがとうございました。

マーク・ミラー

答えて

3
私は質問を理解しますが、ここではそれで刺しだ
# Missing value patterns (TRUE=missing, FALSE=present) 
patterns <- unique(is.na(dd)) 

result <- list() 
for(i in seq_len(nrow(patterns))) { 
    # Rows with this pattern 
    rows <- apply(dd, 1, function(u) all(is.na(u) == patterns[i,])) 
    result <- append(result, list(dd[rows,])) 
} 
1

完全にわからない...

あなたがしたいまず最初は、要素がNAである把握し、そうではありません。そのためには、is.na()関数を使用できます。

is.na(dd) 

値が他の場所でNAであり、ここでFALSE TRUE含むDDと同じサイズの行列を生成します。

次に、マトリックス内のユニークなパターンを探したいとします。そのためには、 'margin'パラメータを受け取るunique()関数が必要です。この関数は、行列内の一意の行だけを見つけることを可能にします。

zzz <- unique(is.na(dd), margin=1) 

は、あなたのZZZの行列に似た行列を作成し、それはあなたの行列と同一であるので、あなたは、もちろん、1人のために、「TRUE」のNASおよび「FALSE」のために置き換えることができます。

ここからいくつかの方向に進み、これらを別のデータセットに並べ替えることができます。残念ながら、ここでは1つのループが必要になると思います。

results <- list() 
for (r in 1:nrow(dd)){ 
    ind <- which(apply (zzz, 1, function(x) {all(x==is.na(dd[r,]))})) 
    if (ind %in% names(results)){ 
    results[[ind]] <- rbind(results[[ind]], dd[r,]) 
    } 
    else{ 
    results[[ind]] <- dd[r,] 
    names(results)[ind] <- ind 
    } 
} 

この時点で、dasのすべての行が含まれ、NAsのパターンでソートされたリストがあります。 zzzの1行目に表示されるパターンは、結果の1行目と一致し、残りの行は同じパターンになります。

+0

ありがとうございます。両方の答えは、私が望んでいた結果をもたらし、とても役に立ちます。マーク・ミラー –

関連する問題