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ごと、最初の行の情報が残るだけで思うようになってくれない
解決策
に記載があった
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とかするべき(今回のケースでは)