2017-09-27 8 views
0

グループに基づいて欠損値を代入しようとしています。 median()関数が数値データを必要とするエラーが発生していますが、データがすべて数値であるため問題が見えません。ここには最小限再現可能な例があります。中央値が置換され、数値データが必要

set.seed(123) 
cluster = sample(seq(1,10),1000,replace=TRUE) 
V1 = sample(c(runif(100),NA),1000,replace=TRUE) 
V2 = sample(c(runif(100),NA),1000,replace=TRUE) 

df = as.data.frame(cbind(cluster,V1,V2)) 

df_fixed = by(df,df$cluster,function(x){replace(x,is.na(x),median(x, na.rm=TRUE))}) 

エラーが返さ:

median.default(X、na.rm = TRUE)でエラーが発生しました:必要な数値データ

は、このコードはので、しかし動作します問題は中央値関数である。

df_fixed = by(df,df$cluster,function(x){replace(x,is.na(x),1)}) 
+0

使用してください 'set.seed'ようにする等sample' runif'、' 'のような機能を使用して再現 – Sotos

+2

' by'小さなdata.framesにDFを切断された - ありませんクラス数値。列方向のメジアンまたは全体的な中央値に置き換えたいですか? –

+0

私はグループごとに列の中央値を置き換えることを試みています。したがって、グループ1で不足している場合は、グループ1の中央値に置き換えてください。 – user137698

答えて

1
df_fixed <- apply(df[,2:3], 2, function(x) { 
    md <- sapply(sort(unique(df$cluster)), function(k) median(x[df$cluster==k], na.rm=TRUE)) 
    x[is.na(x)] <- md[df$cluster][is.na(x)] 
    return(x) 
}) 

any(is.na(df_fixed)) 
# [1] FALSE 
+0

このコードは、すべてのグループに値がない場合に機能します。何らかの理由で実際のデータに欠損値のないグループがある場合、何も置き換えられません。これらの列をスキップするだけです。これをダミーデータで再現することはできませんので、アイデアがなければ解決策を考えなければなりません。 – user137698

+0

@ user137698私のコードを変更しました。現在、欠損値のない列に対しても機能します。試してみてください。 –

関連する問題