potisanのプログラミングメモ

趣味のプログラマーがプログラミング関係で気になったことや調べたことをいつでも忘れられるようにメモするブログです。はてなブログ無料版なので記事の上の方はたぶん広告です。記事中にも広告挿入されるみたいです。

R 標準ライブラリ・tidyverse系のチップス

Rの自分用チップスです。ちょっとずつ増やしていきたいです。

ベクトルの末尾/先頭N個以外を取り出す

#末尾N個より前側
head(1:10, -3)
#-> 1:7

#先頭N個より後側
tail(1:10, -3)
#-> 4:10

headtail関数の第2引数にマイナスの数を渡すと末尾/先頭N個以外を取り出せます。

ベクトルのインデックスベクトルを安全に返す。

seq_along(LETTERS)
#-> 1:26
seq_along(NULL)
#-> integer(0)

forでインデックスを使いたい場合に便利です。NULLの場合はinteger(0)が返されます。

文字列ベクトルを変形する

purrr::map_chr(LETTERS[1:3], function(s) stringr::str_c(s, "X"))
#-> "AX" "BX" "CX"

パッケージの関数名一覧を返す。

#baseパッケージ
as.character(lsf.str("package:base"))
#utilパッケージ
as.character(lsf.str("package:utils"))

lsf.str関数の戻り値はls_str S3クラスなのでprint.ls_strなどが特殊化されています。表示を簡単にするにはas.characterで文字列ベクトルに変換します。

Rのベースパッケージを検索する

summary(lm(...))の係数情報をtibbleへ変換する。

as_tibbleだけだと行名が消えますが、rownames引数で係数名の列を作成すれば保持できます。

library(tidyverse)
x <- summary(lm(Sepal.Length~Sepal.Width, data=iris))

as_tibble(x$coefficients, rownames="Coef.")
## A tibble: 2 × 5
#  Coef.       Estimate `Std. Error` `t value` `Pr(>|t|)`
#  <chr>          <dbl>        <dbl>     <dbl>      <dbl>
#1 (Intercept)    6.53         0.479     13.6    6.47e-28
#2 Sepal.Width   -0.223        0.155     -1.44   1.52e- 1

列指定時も同様です。

library(tidyverse)
x <- summary(lm(Sepal.Length~Sepal.Width, data=iris))

as_tibble(x$coefficients[,c("Estimate","Pr(>|t|)")], rownames="Coef.")
## A tibble: 2 × 3
#  Coef.       Estimate `Pr(>|t|)`
#  <chr>          <dbl>      <dbl>
#1 (Intercept)    6.53    6.47e-28
#2 Sepal.Width   -0.223   1.52e- 1

summary(lm(...))からF-statisticのP値を取得する。

summary(lm(...))の結果(summary.lm S3クラス)からF-statisticのP値を取得するにはlower.tail=FALSEとしてpf関数を呼び出します。p_value S3関数などを用意すると便利かもしれません。

p_value <- function(...) UseMethod("p_value")
p_value.summary.lm <- function(x) {
  f <- x$fstatistic
  unname(pf(f[1], f[2], f[3], lower.tail=FALSE))
}

p_value(summary(lm(Sepal.Length~Sepal.Width, data=iris)))
#[1] 0.1518983

単回帰分析では係数のP値と同じ値になるので使うことはないそうです(参考:【R】lm()のsummary()の意味と導出方法【回帰分析】 | 世のため自分のためのアウトプット)。

参考

stackoverflow.com

文字列ベクトルのmap結果を名前付きリストにする。

先にset_namesを適用すると名前付きリストになります。

library(purrr)
s <- LETTERS[1:3]

s %>% set_names() %>% map(~str_c(., "+1"))
#$A
#[1] "A+1"
#
#$B
#[1] "B+1"
#
#$C
#[1] "C+1"

セッションの基本パッケージの関数リストを作成する。

library(purrr)
library(stringr)
x <- sessionInfo()$basePkg %>% set_names() %>% map(function(name) as.character(lsf.str(str_c("package:", name))))

関数名のパターンも指定可能です。

library(purrr)
library(stringr)
x <- sessionInfo()$basePkg %>% set_names() %>% map(function(name) as.character(lsf.str(str_c("package:", name), pattern="formula")))

enframeunnest_longerでパッケージ名と関数名のtibbleも作成できます。

library(tidyverse)

#全関数
sessionInfo()$basePkg %>%
  set_names() %>%
  map(function(name) as.character(lsf.str(str_c("package:", name)))) %>%
  enframe() %>%
  unnest_longer(value)

#「*formula*」
sessionInfo()$basePkg %>%
  set_names() %>%
  map(function(name) as.character(lsf.str(str_c("package:", name), pattern="formula"))) %>%
  enframe() %>%
  unnest_longer(value)
## A tibble: 7 × 2
#  name  value            
#  <chr> <chr>            
#1 stats as.formula       
#2 stats DF2formula       
#3 stats formula          
#4 stats reformulate      
#5 stats terms.formula    
#6 stats update.formula   
#7 base  all.equal.formula