はじめに
P値を-log10スケールにして、プロットしたい時がある。
p <- 0.01
-log10(p)
## [1] 2
Rのデータ処理で人気のパッケージ{dplyr}を使う人は、パイプ演算子(%>%)を使ってスッキリと書くことが多い。
例えば、
require(dplyr)
p <- seq(1, 10, by = 1) %>% pnorm(., lower.tail = F)
print(p)
## [1] 1.586553e-01 2.275013e-02 1.349898e-03 3.167124e-05 2.866516e-07
## [6] 9.865876e-10 1.279813e-12 6.220961e-16 1.128588e-19 7.619853e-24
みたいに書ける。pnorm(seq(1, 10, by = 1), lower.tail = F) より可読性高い。
ドットは省略だけど、ドット付きで評価させることで比較的自由にパイプで書ける。
ここに、対数変換もしたいとする。
ほしいのはこういった値。
-log10(p)
## [1] 0.7995455 1.6430161 2.8696990 4.4993349 6.5426457 9.0058643
## [7] 11.8928536 15.2061426 18.9474644 23.1180534
そうだ、パイプで書こう
しかし、パイプ演算子を使って書くとドツボにはまった。
seq(1, 10, by = 1) %>% pnorm(., lower.tail = F) %>% -log10(.)
## [1] 0.9582008 1.6657662 2.8710489 4.4993666 6.5426460 9.0058643
## [7] 11.8928536 15.2061426 18.9474644 23.1180534
正解より大きい。
何が起きているのか
次の評価がされてしまっているようだ。
tmp_fun <- function(x){
x - log10(x)
}
seq(1, 10, by = 1) %>% pnorm(., lower.tail = F) %>% tmp_fun()
## [1] 0.9582008 1.6657662 2.8710489 4.4993666 6.5426460 9.0058643
## [7] 11.8928536 15.2061426 18.9474644 23.1180534
最後の評価で、先頭にマイナスをつけなければ、正しい値がでる。
test1 <- seq(1, 10, by = 1) %>% pnorm(., lower.tail = F) %>% log10(.)
test2 <- log10(pnorm(seq(1, 10, by = 1), lower.tail = F))
all(test1 == test2)
## [1] TRUE
最後の評価で、先頭にプラスをつけるとNG(普通こんなふうに書かないと思うけど)
test1 <- seq(1, 10, by = 1) %>% pnorm(., lower.tail = F) %>% +log10(.)
test2 <- log10(pnorm(seq(1, 10, by = 1), lower.tail = F))
all(test1 == test2)
## [1] FALSE
これまでに書いたコードが心配な人へ
Linux User
find使って検索。カレントディレクトリ以下なら、
find ./ -type f -print | xargs grep '%>% -'
Mac User
Finderで "%>% -" とカギ括弧付きで検索すると、それを含むRscriptなり、Rmdファイルを拾える(ポジコンスクリプトで確認済)。
Windows User
Unknown.
備考
見つけたときは焦ったが、過去の解析について、私は特に実害なかった。
グーグル検索で他の人たちのスクリプトを探そうとしたが、%がどうやっても検索できず断念した。
// 以上。
実行環境
sessionInfo()
## R version 3.3.1 (2016-06-21)
## Platform: x86_64-apple-darwin13.4.0 (64-bit)
## Running under: OS X 10.13.5 (unknown)
##
## locale:
## [1] en_US.UTF-8/en_US.UTF-8/en_US.UTF-8/C/en_US.UTF-8/en_US.UTF-8
##
## attached base packages:
## [1] stats graphics grDevices utils datasets methods base
##
## other attached packages:
## [1] dplyr_0.7.4
##
## loaded via a namespace (and not attached):
## [1] Rcpp_0.12.16 rstudioapi_0.6 bindr_0.1.1
## [4] knitr_1.15.1 magrittr_1.5 xtable_1.8-2
## [7] R6_2.2.2 rlang_0.1.6 stringr_1.2.0
## [10] highr_0.6 tools_3.3.1 miniUI_0.1.1
## [13] htmltools_0.3.5 yaml_2.1.14 rprojroot_1.2
## [16] digest_0.6.12 assertthat_0.2.0 tibble_1.3.4.9003
## [19] bookdown_0.3 bindrcpp_0.2.2 shiny_1.0.1
## [22] questionr_0.6.0 glue_1.2.0 evaluate_0.10
## [25] mime_0.5 rmarkdown_1.8 stringi_1.1.5
## [28] pillar_0.0.0.9000 rmdformats_0.3.2 backports_1.0.5
## [31] httpuv_1.3.3 pkgconfig_2.0.1