未分類のものを適当に並べてあるともいう。

Rでの欠測値の扱い

NAは伝染するという厄介な面もある。臨床データの取り扱い上は避けて通れないためまとめていく。「欠損値でない」を表す時は「!」と「is.na(x)」を用いると便利そう。

Rの非数値の取り扱い方,NULL, NA, NaN, Infの除外と置換 https://stats.biopapyrus.jp/r/basic/nan.html

一部の関数(全ての集約関数)には「na.rm」オプションがあり、欠損値NAを取り除いた上で処理してくれる。設定時は「na.rm = TRUE」で。 ダメな場合は「y <- x[!is.na(x)」とするなど。またデータフレームに関しては「na.omit」という欠損値を含む行を除去する関数もある。→今時の的にはtidyrで「drop_na」とか「replace_na」を用いる?

tidyrで使える欠損値関連操作関数 https://qiita.com/kazutan/items/ab81958994426e67e017#drop_na-replace_na-fill

dplyrで特定の列(変数)がNAである行を取り出す/除くならfilter(d, is.na(x))filter(d, !is.na(x))が使いやすい。

不要なRオブジェクトを削除する

rm()ないしremove()でオブジェクトを指定する。オブジェクト1つを直接指定するならrm(x)で、複数指定するならlist = c("x", "y")c(x, y)だとxyをくっつけたベクトルになるので注意。

x <- c(1, 2)
y <- c(3, 4)

# rm(list = c(x, y))
#> Warning in rm(list = c(x, y)) : object '1' not found
#> Warning in rm(list = c(x, y)) : object '2' not found
#> Warning in rm(list = c(x, y)) : object '3' not found
#> Warning in rm(list = c(x, y)) : object '4' not found

rm(list = c("x", "y"))

現在のオブジェクトの一覧はls()objects()で得られる。どちらもbase関数で全く同じものなので、短いls()を使えば良さそう。

all.equal(body(objects), body(ls))
## [1] TRUE

また、デフォルトではall.names = FALSEとなっているため、.で始まる隠しオブジェクトは出力されない。

x <- c(1, 2)
y <- c(3, 4)

ls()
## [1] "x" "y"
ls(all.names = TRUE)
## [1] ".Last"        ".Random.seed" "x"            "y"

オブジェクトを全部消したければ、通常はrm(list = ls())で良い。

rm(list = ls())

ls()
## character(0)
ls(all.names = TRUE)
## [1] ".Last"        ".Random.seed"

文字列を関数として評価する@R

2018年9月9日 調べるのにめちゃめちゃハマった。 fig1a, fig1b, fig1c, fig1dみたいなグラフオブジェクトがある時に、これらをまとめて

write_rds(fig1a, "data/fig1a.RDS")

みたいな処理をしたかったのだが、mapforループでややろうとするもことごとくエラーか"``fig1a``"というも文字列オブジェクトを保存する結果になってしまった。

eval + parse + texteval + substitute + do.callを用いることになる模様。前者はわかりやすいが遅くて非推奨?後者はdo.callの勉強を兼ねてやって見る感じか。どうしても必要なところ以外はできるだけtidyverseな感じでやっていきたい。

eval + parse + textで処理

結局手が回らないのでこちらだけ。オブジェクトリストを取得してfig[0-9]*的なものだけ抜き出してリストを作成、それをforループなどで処理。%>%eval(parse(text = .), envir = .GlovhbalEnv)とか投げるとエラーが出て解決できなかったので諦めた。

forループ版

リスト作ってforループという王道パターン。とはいえ実はほとんどforループ使っていなかったので良い練習に。

figlist <- ls() %>% # オブジェクト一覧を取得
  str_subset("fig[0-9]") # fig(数字)任意のものを取得

# figlistの各要素についてのforループ
for (i in 1:length(figlist)) {
  # eval(parse(text = string))で文字列stringをコマンドとして実行する
  eval(parse(text = str_c(
    "write_rds(",
    figlist[i],
    ", \"data/",
    figlist[i],
    ".RDS\")"
  )))
}

purrr::walk()

map()だとなぜかplotがもう一度作成されて出力される。保存ももちろんできるけど。 仕方がないのでwalk()を使って保存だけ行わせ、さらにそのsilentな出力を利用して保存対象としたオブジェクトを根こそぎremove()へ放り込むことに。パイプ内の実行になるのでenvir = .GlobalEnvがひ必要になった。

# オブジェクトのリストを取得→fig[0-9]を選択→保存処理
ls() %>%
  str_subset("fig[0-9]") %>% 
  # map()だとなぜかもう一度作図されてしまう?
  walk(~ eval(parse(text = str_c("write_rds(", ., ", \"data/", ., ".RDS\")")))) %>% 
  # walk()にしてsilentな出力(対象のオブジェクト)を削除してしまうことに
  # envir = .GlobalEnvがないとオブジェクトと環境が違うのでエラーに
  remove(list = ., envir = .GlobalEnv)

rlang::eval_tidy

eval()も置き換えるならこれ?挙動が把握できずにギブアップ

Rにおける暗号化・匿名化

Rの中で処理できる方法について

ハッシュ生成とsaltキーの付加 Opensslパッケージ(付随してshaとかmd5が使えるように)

install.packages("openssl")

でsha256でsaltキー付きで生成とか?そのキーをランダムに生成する? しかしsha256(x, key = KEY)のKEYはベクトル入力できない模様。forループ作るかいちいちやるかになりそう。

https://www.rdocumentation.org/packages/openssl/versions/0.9.9/topics/hashing

匿名化ID用のランダム文字列生成 匿名化ID用の文字列生成は以下のスレッドを参考に https://stackoverflow.com/questions/42734547/generating-random-strings

「stringi」パッケージがtidyverseにも入っている「stringr」の上位互換(stringrがstringiのラッパーになっているらしい)なのでそれを使うのが一番よさそう。

#  n個のlength文字数のランダムな文字ベクトルを生成
stringi::stri_rand_strings(n = 10, length = 5)
## "imN8B" "ZP51E" "xf73X" "l2g3u" "Tc63B" "h1jW7" "PQf7Z" "f3Cl9" "2HZ9P" "o97aG"

# 引数patternで使用する文字列を設定できる
stringi::stri_rand_strings(n = 10, length = 5, pattern = "[a-zあ-ん]")

最初はアルファベット5文字、数字4つ、アルファベット、などなら以下のようなコードがあるらしい

library(stringi)
sprintf("%s%s%s", stri_rand_strings(5, 5, '[A-Z]'),
     stri_rand_strings(5, 4, '[0-9]'), stri_rand_strings(5, 1, '[A-Z]'))


do.call(paste0, Map(stri_rand_strings, n=5, length=c(5, 4, 1),
           pattern = c('[A-Z]', '[0-9]', '[A-Z]')))

匿名化IDの表を印刷して、そこに本当のID、日付、必要なら氏名などを記載して鍵付きロッカー(個人情報保管用として定められたところ)へ

ベクトルやデータフレームの入出力を便利に

文字列ベクトルをコピペできる形で出力したい

直接入力ではなく作成された文字列ベクトルの中身を他のコードやサンプルコードとして使うためにコピペしたいときに、なかなかうまいこと出力できなかった。とりあえず強引に前後に"をつけてcat(sep = ", ")でコンソールに出力することには成功したが、もう少しうまい方法がないものだろうか

# ランダム生成していますが、何らかの形で(直接入力ではなく)得られた文字列ベクトルです
nms <- stringi::stri_rand_strings(n = 20, length = 10)

# 普通にコンソールに出力すると「[1]」が入ってカンマもないのでコピペしにくい
nms
##  [1] "AdZf8SmxpS" "ORi84PrTlI" "zQQ8TrCiaG" "6NJwmpDvrl" "Iq6graja6L"
##  [6] "4jiz4QLCnM" "nrstHDpkhR" "mgkwnFXc2K" "JJKOZcwd3r" "BtAo0kVkLI"
## [11] "lNNnWC3A9D" "VKm0fxT4tG" "wo3IGBkD4I" "BvirOYNOqu" "aq2SUq24SE"
## [16] "G8DJOqEi31" "LDsIH06olH" "kjOG7IPq1j" "OTmZ8q6QMs" "sZIF5QSUIS"
# とりあえず強引に出力してみました
nms %>% stringr::str_replace_all(c("^" = '"', "$" = '"')) %>% cat(sep = ", ")
## "AdZf8SmxpS", "ORi84PrTlI", "zQQ8TrCiaG", "6NJwmpDvrl", "Iq6graja6L", "4jiz4QLCnM", "nrstHDpkhR", "mgkwnFXc2K", "JJKOZcwd3r", "BtAo0kVkLI", "lNNnWC3A9D", "VKm0fxT4tG", "wo3IGBkD4I", "BvirOYNOqu", "aq2SUq24SE", "G8DJOqEi31", "LDsIH06olH", "kjOG7IPq1j", "OTmZ8q6QMs", "sZIF5QSUIS"

r_wakalangで聞いてみた

atusyさんからあっさりとbase::dput()を、その後datasciestosistさんからwriteClipboard(toString(sprintf('"%s"',nms)))を、yutannihilationさんからdatapastaパッケージを紹介していただいた。dput()とか本当にそのままです。検索キーワード難しい……。

# baseにそのままの関数がありましたとさ
base::dput(nms)
## c("AdZf8SmxpS", "ORi84PrTlI", "zQQ8TrCiaG", "6NJwmpDvrl", "Iq6graja6L", 
## "4jiz4QLCnM", "nrstHDpkhR", "mgkwnFXc2K", "JJKOZcwd3r", "BtAo0kVkLI", 
## "lNNnWC3A9D", "VKm0fxT4tG", "wo3IGBkD4I", "BvirOYNOqu", "aq2SUq24SE", 
## "G8DJOqEi31", "LDsIH06olH", "kjOG7IPq1j", "OTmZ8q6QMs", "sZIF5QSUIS"
## )
# datapastaパッケージが汎用性が高そうでRStudioのアドインもある
# 出力がその場にペーストになるのでコードチャンクには向かないけど
# datapasta::vector_paste(nms)

Rで日本語出力

PDF(LaTeX)関連 標準で用いられる「pdflatex」は日本語が扱えないらしく、「XeLaTeX」を使うことになる。 macOSでLaTeXで先にLaTeXが利用できるようにしておく。

uriさんのlab.noteを参考に拡張して行くのが良さそう。 RユーザーがLaTeXユーザーと仲良くするべき理由 - Qiita uribo/lab.note: Create Laboratory Note and Report Using R Markdown

この場合にはfont-awsomeをインストールしておく(ないとエラーになる) FortAwesome/Font-Awesome: The iconic SVG, font, and CSS toolkit

brew tap caskroom/fonts
brew cask install font-fontawesome

ご注文はFont Awesomeですか? 第1羽「ひと目で尋常でないスライドだと見抜いたよ」 - Qiita のようにLaTeXに限らずちょっとしたスライドなんかにも使えそう。

header-includes:
  - \usepackage{natbib}
  - \usepackage{fancyhdr}
  - \usepackage{fourier-orns}
  - \usepackage{lscape}
  - \usepackage{soul}
  - \pagestyle{fancy}
  - \usepackage{rotating}
  - \usepackage{scrextend}
  - \changefontsizes{12pt}
  - \usepackage{zxjatype} # Comment out when using Japanese.
  - \setjamainfont{Hiragino Kaku Gothic Pro} # Set for Japanese font.
  - \lhead{\slshape \rightmark} \rhead{\slshape \today}
  - \usepackage{fontspec, fontawesome} # require installed FontAwesome
  - \newcommand{\onmline}{{\LARGE \decofourleft \hspace{0.1cm} \hrulefill\hspace{0.2cm} \floweroneleft \floweroneright \hspace{0.2cm} \hrulefill \hspace{0.1cm} \decofourright}}
output:
  pdf_document:
    latex_engine: xelatex
    toc: yes
    toc_depth: 3
    highlight: tango
    fig_caption: yes
# bibliography: bibliography.bib ## ref) http://rmarkdown.rstudio.com/authoring_bibliographies_and_citations.html
mainfont: Times New Roman
# mathfont:
monofont: Ricty

以下はなくても行けてそう。

日本語文章の折り返しがうまくいかない XeLaTeXは単語間のスペースを折り返し(改行)候補とするらしく、日本語だとうまくいかない。意図的に改行したい場合には半角スペースを2つ重ねる方法もあるとのことだが実用的ではない。

ヘッダーで改行の様式を指定することでうまく行く模様。

Rmarkdownで日本語PDFを出力する - Qiita

---
output:
  pdf_document:
    latex_engine: xelatex
documentclass: bxjsarticle
classoption: xelatex,ja=standard
geometry: no
---

---
output:
  pdf_document:
    latex_engine: xelatex
header-includes:
  - \usepackage{bookmark}
  - \usepackage{xltxtra}
  - \usepackage{zxjatype}
  - \usepackage[ipa]{zxjafont}
---

bxjsarticle CTAN: Package BXjscls CTAN: Package BXjsclsというXeLaTeXを含む多くのパッケージで日本語をうまく扱うためのパッケージに含まれる「bxjsarticle」を用いるのが良さそうだが、2016あたりからの記事では「subtitle」コマンドが二重に定義されていてエラーが出るとの記載が多い。

R,knitPDF bxjsarticleを用いた際にサブタイトルでエラーが出る場合の対処法 | トライフィールズ RStudio で Rmd ファイルから日本語 PDF を作成する方法 | miyazakikenji

ZXjatypeパッケージ ZXjatype パッケージ ~XeLaTeX でまともな日本語組版を~ [電脳世界の奥底にて]

標準のプロット関連

ggplot2関連

bookdownパッケージ関連

bookdownにする際はさらにややこしい問題がありそう。下記のはlualatexを使用している模様。 kazutan/bookdown_ja_template: for bookdown starter kits for japanese.

Rの環境問題

.GolobalEnvとかの。

R用語集

データ解析のための統計モデリング入門

データ解析のための統計モデリング入門 久保拓弥 岩波書店 R界隈では緑本と呼ばれてる?