グループごとに複数列の欠損値じゃない数、合計額を算出したい

質問

複数の列に対して集計処理をいっぺんにやる方法を参考に、グループごとに、列のNAでない個数、数値の合計額を算出したいのですが、どのような関数を記述することになりますか?

回答

NAじゃない行をグループごとにカウントするには下記のコマンドで可能です。

summarize_if(is.numeric, funs(sum(![is.na](http://is.na/)(.), na.rm=TRUE)))

is.na()という便利な関数があり、これはNAかどうか判定してくれます。

ここに条件式の否定である!を前に付け足すことで、NAでない場合ということになります。

これを使い、sumの中にいれてあげることでやりたいことができるかと思います。

私としては、ブランチを切ってそれぞれ合計値、行数をカウントする列を作った方が管理がしやすいかと思っています。

ただ、一気にこれもやる方法はあります。

cをつかって、中にそれぞれ関数を呼び込むとできます。

summarize_if(is.numeric, c(funs(sum(![is.na](http://is.na/)(.), na.rm=TRUE)), funs(sum(., na.rm=TRUE))))

ただ、この場合だと元の列が多い場合はかなり増えてしまいます。

また、列名が…1, …2のようになることにも注意が必要です。

複数の列名の変換には、こちらのコミュニティのトピックも参考にしてみてください。