9

データの一部の欠損値を、類似したグループの平均値に置き換えようとしています。

私のデータは次のようになります。

   X   Y
1  x   y
2  x   y
3  NA  y
4  x   y

そして、私はそれを次のようにしたい:

  X   Y
1  x   y
2  x   y
3  y   y
4  x   y

私はこれを書きました、そしてそれはうまくいきました

for(i in 1:nrow(data.frame){
   if( is.na(data.frame$X[i]) == TRUE){
       data.frame$X[i] <- data.frame$Y[i]
   }
  }

しかし、私の data.frame はほぼ 50 万行の長さで、for/if ステートメントはかなり遅いです。私が欲しいのは次のようなものです

is.na(data.frame$X) <- data.frame$Y

しかし、これはサイズの不一致エラーになります。これを行うコマンドがあるはずですが、ここの SO または R ヘルプ リストで見つけることができません。何か案は?

4

3 に答える 3

11

ifelseあなたの友達です。

Dirk のデータセットの使用

df <- within(df, X <- ifelse(is.na(X), Y, X))
于 2011-07-13T21:26:31.523 に答える
8

それをベクトル化するだけです。ブール インデックス テストは 1 つの式であり、それを代入でも使用できます。

データの設定:

R> df <- data.frame(X=c("x", "x", NA, "x"), Y=rep("y",4), stringsAsFactors=FALSE)
R> df
     X Y
1    x y
2    x y
3 <NA> y
4    x y

次に、置換する場所のインデックスを計算し、次のように置換します。

R> ind <- which( is.na( df$X ) )
R> df[ind, "X"] <- df[ind, "Y"]

これにより、望ましい結果が得られます。

R> df
  X Y
1 x y
2 x y
3 y y
4 x y
R> 
于 2011-07-13T19:49:55.343 に答える
0

残念ながら、まだコメントすることはできませんが、文字列または文字が含まれる一部のコードをベクトル化している間、上記は機能しないようです。この回答で説明されている理由。文字が関係している場合 stringsAsFactors=FALSEは、R が既に文字から要素を作成している可能性があるため、十分ではありません。データも再び文字ベクトルになるようにする必要があります。 data.frame(X=as.character(c("x", "x", NA, "x")), Y=as.character(rep("y",4)), stringsAsFactors=FALSE)

于 2014-11-03T11:36:38.103 に答える