私は、パーセンテージ(0.00 - 100.00、浮動小数点)でまれに埋め込まれる非常に長いデータフレーム(〜1,100万x 130)を持っています。
欠落している項目は、以下のように「NA」と表示されます。
cat1 NA NA 99.90 NA NA 10.90 NA
cat2 NA 1.00 NA 19.12 NA NA NA
cat3 NA NA NA NA NA NA 45.00
私はこのデータフレームを行ごとに見て、「NA」の発生回数を合計したいと思います。
通常、次の操作を実行してRでこれを簡単に実行できますが、ファイルが大きすぎるapply(data.frame, 1, function(x) sum(is.na(x))
ため、メモリの問題が引き続き発生します。可能であれば、AWKを使用してこれを実行して、将来の同様の問題を解決するためにコマンドラインに適用できるようにしたいと思います。
私はawkに精通していませんが、基本的に各レコード/行のフィールドで「NA」の発生回数を合計してファイル行をスキップするためのインデックスとして使用できます。
事前にありがとう
答え1
一般的な話す:
$ awk '{ for (i=2;i<=NF;i++) if ($i=="NA") c++; print c; c=0 }' file
5
5
6
答え2
パターンに一致する文字列置換機能を使用しNA
て、1行あたりの発生数を計算して、以下のようにファイル全体を合計することができます。
awk '{ sum += gsub(/NA/, "", $0) } END { print sum }' file
または、パターンとの間違った一致を防ぐために、より強力にしてくださいNA
。次の正規表現は入力の例に基づいていますが、NA
ファイルの先頭には表示されません。
awk '{ sum += gsub(/[[:space:]]*NA[[:space:]]*|[[:space:]]*NA$/, "", $0) } END { print sum }' file
答え3
ヘッダーのない表:
awk '{ sum += gsub(/[[:space:]]*NA[[:space:]]*|[[:space:]]*NA$/, "", $0) ; print sum }' file
タイトル付きテーブル:
awk 'NR > 1{ sum += gsub(/[[:space:]]*NA[[:space:]]*|[[:space:]]*NA$/, "", $0) ; print sum }' file