2016-09-21 38 views
2

大規模なデータセットの場合は、おそらくシンプルだが扱いにくい質問でしょう。以下のように等しい寸法の2つのデータフレーム(df1df2)を考える:2つのデータフレームでのNAsの条件付き置換R

head(df1) 
      a   b c 
1 0.8569720 0.45839112 NA 
2 0.7789126 0.36591578 NA 
3 0.6901663 0.88095485 NA 
4 0.7705756 0.54775807 NA 
5 0.1743111 0.89087819 NA 
6 0.5812786 0.04361905 NA 

head(df2) 
      a   b c 
1 0.21210312 0.7670091 NA 
2 0.19767464 0.3050934 1 
3 0.08982958 0.4453491 2 
4 0.75196925 0.6745908 3 
5 0.73216793 0.6418483 4 
6 0.73640209 0.7448011 5 

どのようにしif(all(is.na(df1))が、この場合cには、df2に移動し、すべての値を設定し、すべての列を見つけることができます一致列(c)からNAsに一致する。

所望の出力

head(df3) 
      a   b c 
1 0.21210312 0.7670091 NA 
2 0.19767464 0.3050934 NA 
3 0.08982958 0.4453491 NA 
4 0.75196925 0.6745908 NA 
5 0.73216793 0.6418483 NA 
6 0.73640209 0.7448011 NA 

私の実際のデータフレームは、以上の140000の列を持っています。

+0

次のようになります。 '(colSums(is.na(x))== nrow(x))'は、ここで実装されています:https://github.com/sjPlot/sjmisc/blob/master/R/is_empty.R#L94 – Daniel

+2

だから、 'df2 [、empty_cols(df1)] < - NA'は動作するはずです(今はテストできず、携帯電話からのコメントです)。 – Daniel

答えて

3

私たちは、「DF2」の列のサブセットと、それを割り当てるために、これを使用し、TRUEになり、他のすべてFALSE 0非NA要素ように!() the vector`を否定、否定論理行列(is.na(df1))にcolSumsを使用することができますNAへ。

df2[!colSums(!is.na(df1))] <- NA 
df2 
#   a   b c 
#1 0.21210312 0.7670091 NA 
#2 0.19767464 0.3050934 NA 
#3 0.08982958 0.4453491 NA 
#4 0.75196925 0.6745908 NA 
#5 0.73216793 0.6418483 NA 
#6 0.73640209 0.7448011 NA 

それとも別のオプションは、列をループにあるとall要素は「DF2」の列をサブセット化し、NA

にそれを割り当てるための論理ベクトルを作成するNAであるかどうかを確認してください
df2[sapply(df1, function(x) all(is.na(x)))] <- NA 

これらは、大きなデータセットの場合は、別のオプションは、あなたがこのコードで「空」の列を取得することができますdata.tableからset(これは場所に割り当てを行うなど、より効率的でなければなりません)

library(data.table) 
setDT(df2) 
j1 <- which(sapply(df1, function(x) all(is.na(x)))) 

for(j in j1){ 
    set(df2, i = NULL, j = j, value = NA) 
} 
+0

このスマートな答えに感謝します。それは素晴らしい仕事をしましたが、 'dim = 4779 rowsと141743 columns'の' df'で完了するのに時間がかかります。 – code123

+0

@ code123私は 'data.table'ソリューションも追加しました。違いがあるかどうか確認してください – akrun

関連する問題