R
集計
dplyr

【R】NAを含む演算

IDごとの合計がNAになってしまう

はいけい

↓みたいなデータを、Rの{dplyr}で整形をしていて、
------BEFORE------

ID  年月 dummy1 dummy2 dummy3
AA 201601 1 NA NA
AA 201602 1 NA NA
AA 201604 NA 1 1
BB 201601 1 NA NA
BB 201604 NA 1 NA
CC 201601 NA 1 NA
CC 201602 NA 1 NA
...

これを↓みたいにしたかった
(IDに対して、年月ごとのダミー変数の値をユニークにしたかった)

------AFTER------

ID  年月 dummy1 dummy2 dummy3
AA - 1 1 1
BB - 1 1 0
CC - 0 1 1

もんだい

test.R
library(dplyr)

#CODE1
df2 <- df%>%
    group_by(ID)%>%
    mutate(dummy1=max(dummy1),dummy2=max(dummy2),dummy3=max(dummy3))%>%
    distinct(ID,.keep_all=TRUE)

#CODE2
df2 <- df%>%
    group_by(ID)%>%
    summarize(dummy1=max(dummy1),dummy2=max(dummy2),dummy3=max(dummy3))

↓の表が出来上がる😨😨😨😨

ID  年月 dummy1 dummy2 dummy3
AA - 1 NA NA
BB - 1 NA NA
CC - 0 1 1

各IDごと、最初の行の情報が残るだけで思うようになってくれない

解決策

Colorless Green Ideas

に記載があった

Rにおいて、NAが関わる演算は基本的にNAを返す

これのせいでした。
集計したあとでNAを0に置き換えればいいと思っていたのですが、先にやるべきでした😥

とっとこ駆け出しエンジニアぶろぐ

を参考にさせていただいて…

test2.R
library(dplyr)

#CODE1

df[is.na(now)] <- 0

df2 <- df%>%
    group_by(ID)%>%    mutate(dummy1=max(dummy1),dummy2=max(dummy2),dummy3=max(dummy3))%>%
    distinct(ID,.keep_all=TRUE)

#CODE2
df2 <- df%>%
    group_by(ID)%>%
    summarize(dummy1=max(dummy1),dummy2=max(dummy2),dummy3=max(dummy3))

これで望みどおり、IDごとにそれぞれの月に分かれているダミーを反映して1行に変換できました。

------AFTER------

ID  年月 dummy1 dummy2 dummy3
AA - 1 1 1
BB - 1 1 0
CC - 0 1 1

まとめ

R では、NAを含む演算はNAを返す

▶NAを先に埋めてからsummarizeとか、mutateとかするべき(今回のケースでは)