LoginSignup
0
0

More than 5 years have passed since last update.

【R】NAを含む演算

Last updated at Posted at 2017-07-15

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とかするべき(今回のケースでは)

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0