2015-09-14 15 views
14

DATA TABLEの列にあるNAsを同じ列の平均で置き換えたいとします。私は次のことをしています。しかし、それは動作していません。それは値(4.9、4.7、4.6、5.0)の残りの平均値となっている必要があるときNAsをdata.tableの同じ列の平均に置き換えます。

ww <- data.table(iris) 

ww <- ww[1:5 , ] 

ww[1,1] <- NA 

    Sepal.Length Sepal.Width Petal.Length Petal.Width Species 
1:   NA   3.5   1.4   0.2 setosa 
2:   4.9   3.0   1.4   0.2 setosa 
3:   4.7   3.2   1.3   0.2 setosa 
4:   4.6   3.1   1.5   0.2 setosa 
5:   5.0   3.6   1.4   0.2 setosa 


ww[is.na(Sepal.Length) , Sepal.Length:= mean(Sepal.Length, na.rm = T)] 

    Sepal.Length Sepal.Width Petal.Length Petal.Width Species 
1:   NaN   3.5   1.4   0.2 setosa 
2:   4.9   3.0   1.4   0.2 setosa 
3:   4.7   3.2   1.3   0.2 setosa 
4:   4.6   3.1   1.5   0.2 setosa 
5:   5.0   3.6   1.4   0.2 setosa 

は、なぜ私はNAの代わりにはNaNを取得していますか?

この構文で何か問題がある場合に備えて、これに代わる方法は何ですか?

データテーブルの構文が必要です。

+2

、どのこの時点で単一の「NA」のみを含む。 –

+0

@AkhilNairはあなたを得ていませんでした。あなたは例を挙げていただけますか? – user3664020

+0

@RHertelあなたのソリューションはNAだけでなく列全体を置き換えています。 – user3664020

答えて

21

na.aggregate同じ列の非-NASの平均でNASに置き換えます。

library(zoo) 

ww[, Sepal.Length := na.aggregate(Sepal.Length)] 
+0

na.aggregateがまだdata.table内の関数であるかわかりません... – colin

+1

'na.aggregate'は動物園の関数です。 'library'ステートメントに注意してください。 –

+0

ありがとうございます。新しい投稿をする前に、NAなどの他の列の平均値を種などのグループ別に取るように、ソリューションのインデックスを作成する方法はありますか? – colin

4

Sepal.Length列全体の平均を取っていません。あなたが選んだ1列だけです。

むしろ使用:

ベースRで
ww[is.na(Sepal.Length) , Sepal.Length:= mean(ww$Sepal.Length, na.rm=TRUE)] 
+0

は、この構文はdata.tableに有効ですか? – user3664020

+0

@ user3664020それは今です。 – zx8754

+3

グローバルスコープから 'ww'のスコープ内で' Sepal.Length'を呼び出すことは、おそらく悪い習慣です。別の例では、 'ww'をグローバルに呼び出すと、後続のものを壊すカラムを並べ替えたかもしれません。 –

6

ww$Sepal.Length[is.na(ww$Sepal.Length)] <- mean(ww$Sepal.Length, na.rm = T) 
+4

この構文をdata.tableの構文に変換できますか? – user3664020

6

はあなたの試みはそれ以上の操作はこれらのみを '見る' ことができますので、

> ww[is.na(Sepal.Length)] 
    Sepal.Length Sepal.Width Petal.Length Petal.Width Species 
1: 

    NA   3.5   1.4   0.2 setosa 

を選択し、最初のテーブルのサブセットつまり、Sepal.Lengthはその1つしか見ることができませんNA

data.table解決策は、以下の通りです。テーブル全体を見て、NAifelseを使って置き換えます。動物園パッケージの

ww[, Sepal.Length := ifelse(is.na(Sepal.Length), mean(Sepal.Length, na.rm = TRUE), Sepal.Length)] 
+2

'' ifelse'は通常遅いので、 'ww [、Sepal.Length:= replace(Sepal.Length、is.na(Sepal.Length)、mean(Sepal.Length、na.rm = TRUE))]]' 'です。 「Sepal.Length」はここで4回タイピングする必要があることを迷惑に思います。 – Frank

8

zoo答えは、それは新しい依存関係を必要とするかなりいいですが。
ちょうどdata.tableを使用すると、以下を行うことができます。

library(data.table) 

# prepare data 
ww = data.table(iris[1:5,]) 
ww[1, Sepal.Length := NA] 

# solution 
ww[, Sepal.Length.mean := mean(Sepal.Length, na.rm = TRUE) # calculate mean 
    ][is.na(Sepal.Length), Sepal.Length := Sepal.Length.mean # replace NA with mean 
    ][, Sepal.Length.mean := NULL # remove mean col 
     ][] # just prints 

それは動物園のに比べ大きめに見えるかもしれないが、それはすべてのステップを参照:=アップデートを使用して作られていて、効率的なパフォーマンスがあります。 NAをグループで平均で置き換えるように簡単に調整することもできます。ちょうどby引数をdata.tableに使用するだけです。

3

tidyrは、あなたがこのために使用することができますreplace_na、機能が組み込まれています:その後、 `Sepal.Length`列に操作を適用し、問題はあなたが最初のデータセットをサブセット化しているということです

library(tidyr) 
ww %>% replace_na(list(Sepal.Length = mean(.$Sepal.Length, na.rm = TRUE))) 
関連する問題