#はじめに
Praatで推定した音響特徴量の推定結果(csvファイル)をRでt検定を行なったら,数値以外のデータ(欠損値)が含まれていると怒られてしまった.
csvファイルにある欠損値(--undefined--)という文字列をRで欠損値として扱えるNAにシェルを使って変換したら解決できたので,備忘録として書いておきます.
#環境
macOS Catalina(10.15.6)
R 3.6.3
Praat 6.1.12
#発生した問題
csvファイルに特定の文字列が含まれているせいで,Rで以下のようなエラーが発生しt検定が行えませんでした.
Error in var(x) (tTest.R#33): Calling var(x) on a factor x is defunct.
Use something like 'all(duplicated(x)[-1L])' to test for a constant vector.
どうも引数xが無効だと言われている.
csvのデータを眺めたところ,何箇所か数値ではなく--undefined--という文字列になっており,これが悪さをしているようだった.
#解決方法
###R側
Rではt.testの末尾に,欠損値を無視するオプション rm.na = TRUE を追加
t.test(dfX, dfY, var.equal = F, na.rm = TRUE)
###Praatのcsv側
Praatで音響特徴が推定できなかった場合,--undefined--という文字列がセルに書き込まれる.
この文字列がR側で欠損値として扱えず,文字列と判断されたためエラーを起こしていた.
この--undefined--をNAという文字列に変換することで解決しました.
pythonでプログラムを書こうと思ったが,macではシェルの方が便利ということでシェルで書き換えました.
sed -i 'fileName.bak' 's/--undefined--/NA/g' fileName.csv
ちなみに,macの場合はsed -i を使う際にバックアップファイルを作成する必要があるらしい.
バックアップがいらない場合は,'fileName.bak'を''にすれば良い.
-i オプションで元のファイルにそのまま上書きができる.
#おわりに
シェルを使うことで,csvに含まれる特定の文字列を別の文字列に一括変換するという便利な方法とR側のtテストで欠損値を無視するオプションを追加することで解決をした.同様の問題で統計分析が行えない,手動で全ての値を置き換えた等していた人の助けになれば嬉しく思います.
Qiitaへの初投稿で,Markdown記法にも不慣れなため見辛い点もあるかと思いますが,ミスやもっと良い方法があるよという方は気軽に教えていただけると幸いです.
#参考文献
sedについては,以下のサイトを参考にしました.
眠る猫の頁,"sedでファイルを上書き保存,"
http://www.dab.hi-ho.ne.jp/sasa/biboroku/unix/sed-i.html