Rで解析:NA値の取り扱いが楽々「mde」パッケージ

Rの解析に役に立つ記事
スポンサーリンク

行または列のNA値の出現数でデータを除外するだけでなく、指定値をNA値へ変換するなどの作業が簡単になるパッケージの紹介です。意外とNA値の取り扱いは面倒なので本パッケージを利用してみてはいかがでしょうか。

パッケージのバージョンは0.3.2。実行コマンドはwindows 11のR version 4.1.2で確認しています。

スポンサーリンク

パッケージのインストール

下記コマンドを実行してください。

#パッケージのインストール
install.packages("mde")

実行コマンド

詳細はコメント、パッケージヘルプを確認してください。

#パッケージの読み込み
library("mde")

###データ例の作成#####
#欠損値を999と想定
#tidyverseパッケージがなければインストール
if(!require("tidyverse", quietly = TRUE)){
  install.packages("tidyverse");require("tidyverse")
}
set.seed(1234)
n <- 50
TestData <- tibble(Group = rep(paste0("Group", 1:5), time = 10),
                   Num_Data = sample(c(1:3, NA, 999), n, replace = TRUE),
                   Char_Data = sample(c("&#12363;&#12425;&#12384;", "999", "n/a", "&#12356;&#12356;&#12418;&#12398;"),
                                      n, replace = TRUE),
                   Date = sample(c("22.02.15", 999, NA), n, replace = TRUE))
#&#30906;&#35469;
TestData
# A tibble: 50 x 4
  Group  Num_Data Char_Data Date    
  <chr>     <dbl> <chr>     <chr>   
1 Group1       NA 999       NA      
2 Group2        2 &#12363;&#12425;&#12384;    999     
3 Group3      999 &#12356;&#12356;&#12418;&#12398;  22.02.15
4 Group4       NA 999       999     
5 Group5        1 n/a       999     
6 Group1      999 999       999     
7 Group2       NA &#12356;&#12356;&#12418;&#12398;  22.02.15
8 Group3        2 &#12356;&#12356;&#12418;&#12398;  NA      
9 Group4        2 &#12363;&#12425;&#12384;    NA      
10 Group5       NA n/a       22.02.15
# ... with 40 more rows
#########

#NA&#25968;&#12434;&#12459;&#12454;&#12531;&#12488;:get_na_counts&#12467;&#12510;&#12531;&#12489;
#&#12487;&#12540;&#12479;&#12398;&#12464;&#12523;&#12540;&#12503;&#21015;:grouping_cols&#12458;&#12503;&#12471;&#12519;&#12531;
#&#38500;&#22806;&#21015;:exclude_cols&#12458;&#12503;&#12471;&#12519;&#12531;
get_na_counts(TestData, grouping_cols = "Group")
# A tibble: 5 x 4
  Group  Num_Data Char_Data  Date
  <chr>     <int>     <int> <int>
1 Group1        3         0     4
2 Group2        4         0     1
3 Group3        1         0     2
4 Group4        2         0     7
5 Group5        1         0     5

#&#25351;&#23450;&#12375;&#12383;&#25991;&#23383;&#21015;&#12434;NA&#12395;&#32622;&#25563;:recode_as_na&#12467;&#12510;&#12531;&#12489;
#&#23550;&#35937;&#21015;&#12434;&#25351;&#23450;:subset_cols&#12458;&#12503;&#12471;&#12519;&#12531;
ReNAData <- recode_as_na(TestData, value = c("n/a", 999),
                         subset_cols = NULL)
#&#30906;&#35469;
get_na_counts(ReNAData, grouping_cols = "Group")
# A tibble: 5 x 4
  Group  Num_Data Char_Data  Date
  <chr>     <int>     <int> <int>
1 Group1        5         7     7
2 Group2        6         3     7
3 Group3        3         2     5
4 Group4        3         5     9
5 Group5        2         8     8

#&#35373;&#23450;&#22522;&#28310;&#12391;&#21015;&#12434;&#38500;&#21435;:drop_na_if&#12467;&#12510;&#12531;&#12489;
#&#22522;&#28310;&#12434;&#35373;&#23450;:sign&#12458;&#12503;&#12471;&#12519;&#12531;;greater_than("gt"),equal("eq"),less_than("lt"),equal_to("eq")
#&#22522;&#28310;&#20516;(%)&#12434;&#35373;&#23450;:percent_na&#12458;&#12503;&#12471;&#12519;&#12531;
Test <- drop_na_if(TestData, sign = "gteq",
                   percent_na = 30, keep_columns = NULL)
#&#30906;&#35469;
get_na_counts(Test, grouping_cols = "Group")
# A tibble: 5 x 3
  Group  Num_Data Char_Data
  <chr>     <int>     <int>
1 Group1        3         0
2 Group2        4         0
3 Group3        1         0
4 Group4        2         0
5 Group5        1         0

#&#35373;&#23450;&#22522;&#28310;&#12391;&#34892;&#12434;&#38500;&#21435;:drop_na_if&#12467;&#12510;&#12531;&#12489;
#&#12487;&#12540;&#12479;&#20363;&#12391;&#12399;&#23550;&#35937;&#12364;3&#21015;&#20869;,NA&#12434;&#21547;&#12416;&#21015;&#12399;Num_Data,Date&#12398;&#12415;&#12391;value&#12398;&#26368;&#22823;&#20516;&#12399;2&#12392;&#12394;&#12427;
Test <- drop_row_if(TestData, sign = "gteq", type = "count" , value = 2)
get_na_counts(Test, grouping_cols = "Group")
# A tibble: 5 x 4
&#12288;Group  Num_Data Char_Data  Date
&#12288;<chr>     <int>     <int> <int>
1 Group1        2         0     3
2 Group2        4         0     1
3 Group3        0         0     1
4 Group4        2         0     7
5 Group5        1         0     5

#&#12487;&#12540;&#12479;&#12398;NA(&#27424;&#25613;&#20516;)&#12394;&#12393;&#12398;&#29366;&#27841;&#12434;&#30906;&#35469;:na_summary&#12467;&#12510;&#12531;&#12489;
#&#20006;&#12403;&#26367;&#12360;&#12398;&#22522;&#28310;&#21015;&#12434;&#25351;&#23450;:sort_by&#12458;&#12503;&#12471;&#12519;&#12531;
#&#20006;&#12403;&#38918;&#12434;&#25351;&#23450;:descending&#12458;&#12503;&#12471;&#12519;&#12531;;&#26119;&#38918;:FALSE/&#38477;&#38918;:TRUE
#&#12487;&#12540;&#12479;&#12398;&#12464;&#12523;&#12540;&#12503;&#21015;:grouping_cols&#12458;&#12503;&#12471;&#12519;&#12531;
#&#38500;&#22806;&#21015;:exclude_cols&#12458;&#12503;&#12471;&#12519;&#12531;
#&#25991;&#23383;&#21015;&#12391;&#23550;&#35937;&#12434;&#25351;&#23450;:pattern_type&#12458;&#12503;&#12471;&#12519;&#12531;:"starts_with","contains","regex",NULL;
#pattern,regex_kind&#12392;&#19968;&#32210;&#12395;&#20351;&#12358;,exclude_cols&#12392;&#12399;&#21516;&#26178;&#19981;&#21487;
#&#25991;&#23383;&#21015;&#12434;&#25351;&#23450;:pattern&#12458;&#12503;&#12471;&#12519;&#12531;
#pattern_type,pattern&#12391;&#25351;&#23450;&#12375;&#12383;&#20869;&#23481;&#12434;&#21547;&#12417;&#12427;&#12363;:regex_kind&#12458;&#12503;&#12471;&#12519;&#12531;;"inclusion"/"exclusion"
na_summary(TestData, sort_by = "Group", descending = FALSE,
           grouping_cols = c("Group", "Char_Data"),
           exclude_cols = "Date",
           #pattern_type = "contains", pattern = "Data", regex_kind = "inclusion",
           )
# A tibble: 19 x 7
  Group  Char_Data variable missing complete percent_complete percent_missing
  <chr>  <chr>     <chr>      <dbl>    <dbl>            <dbl>           <dbl>
1 Group1 999       Num_Data       1        3             75              25  
2 Group1 n/a       Num_Data       2        1             33.3            66.7
3 Group1 &#12356;&#12356;&#12418;&#12398;  Num_Data       0        2            100               0  
4 Group1 &#12363;&#12425;&#12384;    Num_Data       0        1            100               0  
5 Group2 999       Num_Data       0        2            100               0  
6 Group2 n/a       Num_Data       1        0              0             100  
7 Group2 &#12356;&#12356;&#12418;&#12398;  Num_Data       2        1             33.3            66.7
8 Group2 &#12363;&#12425;&#12384;    Num_Data       1        3             75              25  
9 Group3 999       Num_Data       0        1            100               0  
10 Group3 n/a       Num_Data       0        1            100               0  
11 Group3 &#12356;&#12356;&#12418;&#12398;  Num_Data       0        3            100               0  
12 Group3 &#12363;&#12425;&#12384;    Num_Data       1        4             80              20  
13 Group4 999       Num_Data       1        3             75              25  
14 Group4 n/a       Num_Data       1        0              0             100  
15 Group4 &#12356;&#12356;&#12418;&#12398;  Num_Data       0        3            100               0  
16 Group4 &#12363;&#12425;&#12384;    Num_Data       0        2            100               0  
17 Group5 999       Num_Data       0        4            100               0  
18 Group5 n/a       Num_Data       1        3             75              25  
19 Group5 &#12356;&#12356;&#12418;&#12398;  Num_Data       0        2            100               0  

少しでも、あなたの解析が楽になりますように!!

タイトルとURLをコピーしました