2011-08-02 5 views
9

を意味します。これらの値は、対応する行の平均値である必要があり行によってNA値を交換し、私はで取得した行列から、私のNA値を置き換えたい

read.table(…) 

。すなわち、表の次の行

1 2 1 NA 2 1 1 2 

1 2 1 1.43 2 1 2 

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

+2

なぜあなたはこれをやりたいのですか* row-wise *?変数をオブジェクト/サンプルと混同していないかどうかだけを確認します。通常、これは列単位で行い、各変数の平均を計算し、その変数を使用して変数内の「NA」を置き換えます。 –

+0

また、 'read.table()'はdata.frameを返します。あなたはデータフレームか適切なマトリックスについて話していますか? –

+0

@ GavinSimpsonこの理由の1つは、測定に使用する質問を繰り返しているアンケートデータです。他の質問の手段は、不足しているデータを置き換えるために使用されます。 – Irwin

答えて

5
x[is.na(x)] <- mean(x, na.rm=TRUE) # for vectors or for a matrix as a whole 

t(apply(x, 1, function(xv) { xv[is.na(xv)] <- 
            mean(xv, na.rm=TRUE) 
           return(xv)} 
     )) # for a row-oriented sol'n 
+3

これは行列全体の平均を返しませんか? –

+0

そうです。私は彼が行指向のソリューションを望んでいたが、1つを入れます。 –

1
a = c(NA, 1, 2, 3, 10) 
a[which(is.na(a)==TRUE)] = mean(a,na.rm = T) 
+2

これは動作するはずですが、不必要に複雑です。 is.na(a)はブール値のベクトルを返します。したがって、== TRUEは冗長です。長さ<= 'length(a)'のベクトルまたはTRUEとFALSEを含む長さ '' length(a)のベクトルのどちらかでベクトルをインデックスすることができるので、 ''は必要ではありません。 TRUE/FALSEに強制されます)。最後に、TRUEとFALSEにTとFを使用しないでください。上書きされる可能性があるからです。 –

+0

私はより多くの訓練の面を考慮しました:d – user702846

+0

行列については、同じ問題が、すべての平均と置き換えられます。 –

21

ここではいくつかのサンプルデータです。

m <- matrix(1:16, nrow=4) 
m[c(1,4,6,11,16)] <- NA 

ここで私は行の手段でミスを記入します。

k <- which(is.na(m), arr.ind=TRUE) 
m[k] <- rowMeans(m, na.rm=TRUE)[k[,1]] 

データはdata.frameになります。最初にas.matrixを使用して行列に変換する必要があります。あなたはそのフォーマットでそれを残したいと思うかもしれません。戻る使用as.data.frameを変換する。

+1

+1チケットです – joran

+0

ありがとうございます。 '[< - 。data.frame'(' * tmp * '、k、value = c(3.67857142857143、3)]のエラーが発生しました。34375、: 論理的な行列の添字のみが置換に使用されます – Delphine

+1

データフレームを最初に(as.matrix')行列にした後、変換してから戻します( 'as.data.frame')。 – Aaron

関連する問題