dplyrはsummariseの中で同じ変数を指定してはいけない

ハマりポイント

dplyrのsummarise関数を使って、集計処理をしたい。

具体的には、グループ化して、条件に合うベクトルの長さを取得したい。

input_df %.%
dplyr::group_by(グループ化変数) %.%
dplyr::summarise(length(集計したい変数))

しかし、実行してみると、なぜか1が返ってきてしまう。

どうして1が返ってきてしまうのか

それは、関数の戻り値を格納する変数名と、元の変数名が同じだからである。

次の例を見てみよう。

summarise(payment_sum=sum(payment_sum),
mean_payment=mean(payment_sum))

この書き方だと、mean_paymentには謎の合計金額が返されてしまう。

本当は平均支払い金額を知りたいのに・・・。

この時、内部では、mean(payment_sum)で使われるpayment_sumはpayment_sum=sum(payment_sum)になのである。

その結果、mean関数は行数分のベクトルを期待しているのに、長さ1のベクトルが入力されてしまうのだ。

問題が起きないようにするのは?

非常に簡単で、入力と出力で同じ変数を使わないこれさえ守れば何も問題は起きない。