未分類のものを適当に並べてあるともいう。
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))
が使いやすい。
rm()
ないしremove()
でオブジェクトを指定する。オブジェクト1つを直接指定するならrm(x)
で、複数指定するならlist = c("x", "y")
。c(x, y)
だとx
とy
をくっつけたベクトルになるので注意。
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"
2018年9月9日 調べるのにめちゃめちゃハマった。 fig1a, fig1b, fig1c, fig1dみたいなグラフオブジェクトがある時に、これらをまとめて
write_rds(fig1a, "data/fig1a.RDS")
みたいな処理をしたかったのだが、map
やfor
ループでややろうとするもことごとくエラーか"``fig1a``"
というも文字列オブジェクトを保存する結果になってしまった。
eval + parse + text
かeval + 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の中で処理できる方法について
ハッシュ生成と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"
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)
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つ重ねる方法もあるとのことだが実用的ではない。
ヘッダーで改行の様式を指定することでうまく行く模様。
---
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界隈では緑本と呼ばれてる?