2017-03-11 21 views
2

データセットに欠損値を代入しようとしています。私は欠損を補うために値を生成できる予測モデルを持っています。私がdfm [is.na(dfm)] < -imputeを使って代用すると、列方向に値が代入されます。しかし、私は行を賢明にする必要があるので、私はデータマトリックスを転置しました。私の質問は、マトリックスを転置せずにこれを行うエレガントな方法があるということですか?再現可能な例を示すrcodeがあります。欠けている値をベクトルで置き換えます。

 set.seed(1) 
     r=5 
     c=4 
     df<-matrix(runif(r*c), ncol=c) 
     df 
      [,1]  [,2]  [,3]  [,4] 
[1,] 0.2655087 0.89838968 0.2059746 0.4976992 
[2,] 0.3721239 0.94467527 0.1765568 0.7176185 
[3,] 0.5728534 0.66079779 0.6870228 0.9919061 
[4,] 0.9082078 0.62911404 0.3841037 0.3800352 
[5,] 0.2016819 0.06178627 0.7698414 0.7774452 

    d=dim(df) 
    p=0.30 

    #### generate missing data matrix by replacing some values by NAs 
    dfm<-df 
    dfm[matrix(rbinom(prod(d), size=1,prob=p)==1,nrow=d[1])]<-NA 
    dfm 
      [,1]  [,2]  [,3]  [,4] 
[1,]  NA 0.89838968 0.2059746 0.4976992 
[2,] 0.3721239 0.94467527 0.1765568  NA 
[3,] 0.5728534 0.66079779 0.6870228 0.9919061 
[4,] 0.9082078   NA 0.3841037  NA 
[5,] 0.2016819 0.06178627  NA 0.7774452 

    # generate values to impute the missing 
impute<-rgamma(sum(is.na(dfm)),shape=1,scale=0.5) 
    impute 
[1] 0.6804725 0.6029941 0.2770577 0.6035013 0.7812393 

#imputes columnwise 
    dfm[is.na(dfm)]<-impute 
    dfm 
      [,1]  [,2]  [,3]  [,4] 
[1,] 0.6804725 0.89838968 0.2059746 0.4976992 
[2,] 0.3721239 0.94467527 0.1765568 0.6035013 
[3,] 0.5728534 0.66079779 0.6870228 0.9919061 
[4,] 0.9082078 0.60299409 0.3841037 0.7812393 
[5,] 0.2016819 0.06178627 0.2770577 0.7774452 

#impute rowwise 
     tdfm<-t(dfm) 
    tdfm[is.na(tdfm)]<-impute 
    tdfm 
      [,1]  [,2]  [,3]  [,4]  [,5] 
[1,] 0.6804725 0.3721239 0.5728534 0.9082078 0.20168193 
[2,] 0.8983897 0.9446753 0.6607978 0.2770577 0.06178627 
[3,] 0.2059746 0.1765568 0.6870228 0.3841037 0.78123933 
[4,] 0.4976992 0.6029941 0.9919061 0.6035013 0.77744522 

     dfm.fill<-t(tdfm) 
     dfm.fill 

      [,1]  [,2]  [,3]  [,4] 
    [1,] 0.6804725 0.89838968 0.2059746 0.4976992 
    [2,] 0.3721239 0.94467527 0.1765568 0.6029941 
    [3,] 0.5728534 0.66079779 0.6870228 0.9919061 
    [4,] 0.9082078 0.27705769 0.3841037 0.6035013 
    [5,] 0.2016819 0.06178627 0.7812393 0.7774452 
+0

あなたは乱数を使用している場合は、例を再現可能にするために、 'set.seed'を使用してください。 – A5C1D2H2I1M1N2O1R2T1

+0

思い出してくれてありがとう。投稿を編集しました。 – user24318

答えて

4

使用whichではなく、arr.indと一緒に、あなたは最初の行で並べ替えることができますように。

例:

test1 <- matrix(1:12, 3, 4, byrow = TRUE) 
test1[c(1, 3, 8, 6, 10)] <- NA 
test2 <- test1 

impute <- c(-1, -4, -7, -9, -10) 

## What you are currently doing--column-wise 
test1[is.na(test1)] <- impute 
test1 
#  [,1] [,2] [,3] [,4] 
# [1,] -1 2 3 -10 
# [2,] 5 6 -9 8 
# [3,] -4 -7 11 12 

## What it sounds like you want--row-wise 
nas <- which(is.na(test2), arr.ind = TRUE) 
test2[nas[order(nas[, "row"]), ]] <- impute 
test2 
#  [,1] [,2] [,3] [,4] 
# [1,] -1 2 3 -4 
# [2,] 5 6 -7 8 
# [3,] -9 -10 11 12 
+0

@ A5C1D2H2I1M1N2O1R2T1。私の行列に欠損値が2つ以上ある場合、あなたのメソッドは機能します。しかし、私はちょうど1が欠けている場合、それは動作しません。エラーはここで発生します。test2 [nas [order(nas [、 "row"])、]] < - impute。私はコードをチェックすると、それは私にNAと行と列の正しいインデックスを与えます。しかし、サブセッティングでは間違いが生じます。その奇妙なのは、私もあなたの例を1つだけ失ってしまったので、その場合にはうまくいきました! – user24318

関連する問題