139  実践 replace_na

library(tidyverse)
dat <- tibble(
  x = c(1,2,NA,4,5),
  y = c("a",NA,"c",NA,NA),
  z = c("A",NA,NA,"B","C")
)

dat
# A tibble: 5 × 3
      x y     z    
  <dbl> <chr> <chr>
1     1 a     A    
2     2 <NA>  <NA> 
3    NA c     <NA> 
4     4 <NA>  B    
5     5 <NA>  C    

この欠損値を置き換えていきます。

まずは、xを0、yをmiss、zをMISSで置き換えてみます。ひとつ前の動画で学んだListをさっそく使ってみましょう

dat %>% 
  replace_na(list(x = 0, y = "miss", z = "MISS"))
# A tibble: 5 × 3
      x y     z    
  <dbl> <chr> <chr>
1     1 a     A    
2     2 miss  MISS 
3     0 c     MISS 
4     4 miss  B    
5     5 miss  C    

簡単ですね?

あと実は、ベクトルの置き換えも可能なので、

dat2 <- dat %>% 
  mutate(x = replace_na(x, 0),
         y = replace_na(y,"miss"),
         z = replace_na(z,"MISS"))
dat2
# A tibble: 5 × 3
      x y     z    
  <dbl> <chr> <chr>
1     1 a     A    
2     2 miss  MISS 
3     0 c     MISS 
4     4 miss  B    
5     5 miss  C    

長くなりますが、mutateの中で利用することも可能です。

いかがでしょうか?

実は、replace_naの逆を行う関数もありますのでここで一緒に解説しておきます。

dat2 %>% 
  mutate(y = na_if(y,"miss"))
# A tibble: 5 × 3
      x y     z    
  <dbl> <chr> <chr>
1     1 a     A    
2     2 <NA>  MISS 
3     0 c     MISS 
4     4 <NA>  B    
5     5 <NA>  C    

このように、replace_naと逆の動きをするna_if関数を利用すれば、必要のない値をNAに変換するということも可能です。

na_ifの使い方は、

na_if(列名,NAにしたい値)

でOKです。

以上、NAの置き換えの話題でした。