2016-12-14 6 views
1

私には奇妙な問題があります。私には良い解決策を見つけることができませんでした。基本的に、私たちのシステムは人のための得点、を通常として出力します。しかし、システムに2回目に入ってスコアを入力することもあります。また、必要に応じてすべての行を塗りつぶすこともあります。データベースの修正は理想的ですが、それは起こらないでしょう(管理のおかげ)。私たちはまた、理由のために複製されているので、重複ID値を取り除くこともできません。私がする必要があるのは、すべての一致するID値に対してNAを持つフィールドにスコアをコピーすることです。だから、ここのデータ例である:出力は同じデータフレーム内の一致するID値を持つ行を上書きする

ID VAR1 VAR2 VAR3 VAR4 VAR5 
1 16 15 14 15 46 
1 16 15 14 15 46 
2 15 12 11 14 12 
3 14 12 12 15 22 
3 14 12 12 15 22 
4 11 04 12 33 12 
4 11 04 12 33 12 
6 NA NA NA NA NA 

ようになり

ID VAR1 VAR2 VAR3 VAR4 VAR5 
1 16 15 14 15 46 
1 NA NA NA NA NA 
2 15 12 11 14 12 
3 14 12 12 15 22 
3 14 12 12 15 22 
4 NA NA NA NA NA 
4 11 04 12 33 12 
6 NA NA NA NA NA 

私は私の机にそれを移動するために、この問題のために働いて何かを得るために管理しますが、この問題が起こっています私はより良い解決策を望んでいます。私のソリューションは、次のとおりです。

df_2 <- list() 
for(i in df$ID){ 
    filter(df, ID == i) %>% 
    mutate(VAR1 = mean(VAR1, na.rm = TRUE), 
      VAR2 = mean(VAR2, na.rm = TRUE), 
      VAR3 = mean(VAR3, na.rm = TRUE), 
      VAR4 = mean(VAR4, na.rm = TRUE), 
      VAR5 = mean(VAR5, na.rm = TRUE)) 
} -> df_2[[i]] 

# Then we bind this together as a dataframe 
bind_rows(df_2) -> df_replaced 

# Remove the list object as it's huge 
rm(df_2) 

これは動作しますが、それはおよそ千年かかると4回のギグ(df_2)の周りに一時的なリストを作成します。だから私はシステムを完全に停止させるので、できるだけ早く削除する必要があるのです。一致するものがあるように感じますが、NA行をコピーするデータ行を選択する方法が本当にわかりません。

EDIT:固定表の書式設定。

答えて

1

is.namatchを使用して、フィラーとして使用するインデックスと塗りつぶすインデックスを選択する基本Rメソッドです。ここで

df 
    ID VAR1 VAR2 VAR3 VAR4 VAR5 
1 1 16 15 14 15 46 
2 1 16 15 14 15 46 
3 2 15 12 11 14 12 
4 3 14 12 12 15 22 
5 3 14 12 12 15 22 
6 4 11 4 12 33 12 
7 4 11 4 12 33 12 
8 6 NA NA NA NA NA 

トリックを返し

df[is.na(df$VAR1), -1] <- df[match(df$ID[is.na(df$VAR1)], 
            df$ID[ifelse(!is.na(df$VAR1), TRUE, NA)]), -1] 

はdata.frameの行数と同じ長さであるテーブル(match第2引数)を返すようにifelseを使用することです。

関連する問題