potisanのプログラミングメモ

プログラミング素人です。昔の自分を育ててくれたネット情報に少しでも貢献できるよう、情報を貯めていこうと思っています。Windows環境のC++やC#がメインです。

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