

たびたび初歩的な質問で申し訳ありません。  
下記質問では大変お世話になりました。  
[R言語におけるMann Whitney Test （もしくはt-
test）の計算結果の出力する方法](https://ja.stackoverflow.com/questions/36105/r%E8%A8%80%E8%AA%9E%E3%81%AB%E3%81%8A%E3%81%91%E3%82%8Bmann-
whitney-test-%E3%82%82%E3%81%97%E3%81%8F%E3%81%AFt-
test-%E3%81%AE%E8%A8%88%E7%AE%97%E7%B5%90%E6%9E%9C%E3%81%AE%E5%87%BA%E5%8A%9B%E3%81%99%E3%82%8B%E6%96%B9%E6%B3%95)

今度は下記のようなデータの取り扱いについて、ご教授お願い出来ないでしょうか。

[code]

           A1 A2 A3 A4
           31       54
           56    48 69
           11    13 14
           16    18 
                 63 24
                 28 22
           31    33 31
           36    78 31
           41    43 41
    
[/code]

とあるデータの大元の測定器からの出力が上記のようなexcelファイルであり、これまではexcelを使って空欄を削除し、上に詰めていました。

[code]

           A1 A2 A3 A4
           31    48 54
           56    13 69
           11    18 14
           16    63 24
           31    28 22
           36    33 31
           41    78 31
                 43 41
    
[/code]

このようなデータを`wilcox.exact`で実行すると、A2列に数字がないため（全てNA)にエラーがでました。そこで`Data <- Data[
,is.na(Data[1,]) == FALSE]`で1行目に数値データがないものを削除したのですが、列がずれると後々面倒かと思い、`Data[
,is.na(Data[1,])] <-
0`にて、1行目に数値データがない列のNAを全部0にしてみました。（そもそもこの列にデータが無いことは図により認識できるので、とにかく`wilcox.exact`が動けば良しです。）

しかし、excelでの処理を簡素化できないかと思い、

[code]

           A1 A2 A3 A4
           31       54
           56    48 69
           11    13 14
           16    18 
                 63 24
                 28 22
           31    33 31
           36    78 31
           41    43 41
    
[/code]

上記のデータのまま、下記の処理ができないかと考えています。  
・列の値がNAしかないのものはNAを0にする。  
・その他の場合はNAを削除し、上に詰める。

NAを全て0にした場合、演算結果に影響がでるのでは考えていますが、NAを0にする方法も教えていただければ幸いです。

ご指導のほど、よろしくお願いいたします。


CC BY-SA 3.0
2017-07-06T08:02:42.800
36141
2017-07-06T11:30:13.893
24217
question
r
R言語におけるデータフレームから欠損値を除去する方法、欠損値しかない列の除去（もしくは0への変換）


まず，矩形でないデータはdata.frameにはできません。なのでNAを詰めて使うならば，

  1. list型として利用，あるいはそれぞれをベクトルで切り離して利用
  2. long data(縦型データ)へ変換して利用

のいずれかとなります。以降は後者を念頭においています:

[code]

    library(tidyr)
    
    # サンプル用のデータ生成
    df <- data.frame(
      A1 = sample(c(4:6, NA), 10, prob = c(4, 2, 2, 2), replace = TRUE),
      A2 = rep(NA, 10),
      A3 = sample(c(4:6, NA), 10, prob = c(2, 4, 2, 2), replace = TRUE),
      A4 = sample(c(4:6, NA), 10, prob = c(2, 2, 4, 2), replace = TRUE)
    )
    
    # サンプル用データの構造を確認
    str(df)
      #>  'data.frame': 10 obs. of  4 variables:
      #>   $ A1: int  6 5 NA 4 6 5 5 4 5 NA
      #>   $ A2: logi  NA NA NA NA NA NA ...
      #>   $ A3: int  5 6 5 5 6 5 NA NA 5 4
      #>   $ A4: int  6 6 NA 4 6 5 6 6 4 6
    
    # long data(縦型データ)へ変換
    # tidyr::gather関数を使ってます
    df_long <- gather(df, key = fac, value = value, factor_key = TRUE)
    str(df_long)
      #>  'data.frame': 40 obs. of  2 variables:
      #>   $ fac  : Factor w/ 4 levels "A1","A2","A3",..: 1 1 1 1 1 1 1 1 1 1 ...
      #>   $ value: int  6 5 NA 4 6 5 5 4 5 NA ...
    
    # valueの列でNAがあるものを除去
    # tidyr::drop_na関数を使ってます
    df_long_rmNA <- drop_na(df_long, value)
    str(df_long_rmNA)
      #>  'data.frame': 25 obs. of  2 variables:
      #>   $ fac  : Factor w/ 4 levels "A1","A2","A3",..: 1 1 1 1 1 1 1 1 3 3 ...
      #>   $ value: int  6 5 4 6 5 5 4 5 5 6 ...
    
    # NAを別の値へ置換
    # tidyr::replace_na関数を使ってます
    df_long_repNA <- replace_na(df_long, list(value = 0))
    str(df_long_repNA)
      #>  'data.frame': 40 obs. of  2 variables:
      #>   $ fac  : Factor w/ 4 levels "A1","A2","A3",..: 1 1 1 1 1 1 1 1 1 1 ...
      #>   $ value: num  6 5 0 4 6 5 5 4 5 0 ...
    
[/code]

おそらくはこれで希望されたデータの加工ができるかと思います。なお，この縦型データのままで`wilcox.exact`も実行可能です:

[code]

    library(exactRankTests)
      #>   Package 'exactRankTests' is no longer under development.
      #>   Please consider using package 'coin' instead.
    
    # wilcox.exact関数を実行(fomula形式で指定)
    # 引数subsetで，用いるレコード(行)を絞る
    # subsetの使い方についてはsubset関数を参照
    wilcox.exact(value ~ fac, df_long,
                 subset = df_long$fac %in% c("A1", "A3"))
      #>  
      #>    Exact Wilcoxon rank sum test
      #>  
      #>  data:  value by fac
      #>  W = 29, p-value = 0.9776
      #>  alternative hypothesis: true mu is not equal to 0
    wilcox.exact(value ~ fac, df_long_rmNA,
                 subset = df_long_rmNA$fac %in% c("A1", "A3"))
      #>  
      #>    Exact Wilcoxon rank sum test
      #>  
      #>  data:  value by fac
      #>  W = 29, p-value = 0.9776
      #>  alternative hypothesis: true mu is not equal to 0
    wilcox.exact(value ~ fac, df_long_repNA,
                 subset = df_long_repNA$fac %in% c("A1", "A3"))
      #>  
      #>    Exact Wilcoxon rank sum test
      #>  
      #>  data:  value by fac
      #>  W = 47, p-value = 0.9131
      #>  alternative hypothesis: true mu is not equal to 0
    
[/code]

ただ，exactRankTestsパッケージはまもなく開発完了するのでcoinパッケージを使うように，とメッセージがでました。一応coinパッケージのwilcox_test関数を利用したバージョンも以下に示します:

[code]

    library(coin)
      #>  Loading required package: survival
      #>  
      #>  Attaching package: 'coin'
      #>  The following objects are masked from 'package:exactRankTests':
      #>  
      #>      dperm, pperm, qperm, rperm
    wilcox_test(value ~ fac, df_long,
                subset = df_long$fac %in% c("A1", "A3"),
                distribution = "exact")
      #>  
      #>    Exact Wilcoxon-Mann-Whitney Test
      #>  
      #>  data:  value by fac (A1, A3)
      #>  Z = -0.35161, p-value = 0.9776
      #>  alternative hypothesis: true mu is not equal to 0
    
[/code]

出力もつけたほうがわかりやすいかと思ったのですが，長文となり申し訳ありません。


CC BY-SA 3.0
2017-07-06T11:30:13.893
36149
2017-07-06T11:30:13.893
19063
36141
answer