備忘ログ

チラシの裏的備忘録&メモ

Rでデータフレームの下に同じデータの一つの列をALLとかにかえたデータをくっつけたデータを作る関数のメモ

Rでデータフレームの特定の列の値をすべてALLにしてデータフレームと、もとのデータフレームと上下でくっつける処理をたまにするので、ちょいちょい綴りミスったりするので関数化してここにメモしておく。ごくたまに使う。

add_all <- function(data, key, add.string = c("ALL", "all", "All")){
  add.string <- match.arg(add.string)
  if(!is.data.frame(data)){
    warning("only data frames can be handled.")
    return(NA)
  }
  rbind(data, replace(data, key, add.string))
}

データフレームでしか使えない。

# 使い方としては次の通り(出力結果省略)
# IRISデータのSpeciesの列をすべてALLにしたものを元のIRISデータの下にくっつける
add_all(iris, key = "Species")

ALLをAllやallにも選べるようにしている。

雑感

取り合えず、特定の列をALLにしたものを元のデータフレームの下につけるには

rbind(iris, transform(iris, Species = "ALL"))

とかしていた。イマドキ風に{tidyverse}つかって、bind_row()mutate()使ってもいいけど、そうたいしてして書き方は変わらない。

上記を関数化しようとすると、transform()が動的値を列名で受け付けず意図した挙動ができなかった。

なんとかtransform()が動的値をうけつける方法がないかなー、とおもっていたがPass dynamic column name to transform() R function - Stack Overflowを見て諦めろ、とのことでreplace()をつかえよとのことで諦めた。

2021/04/07追記:パッケージ化した

今までブログ上で書き散らかした関数(以外もある)を少し関数名や細かい挙動を調整して、上記の関数もまとめたものをパッケージ化してGitHubからインストールできるようにした(GitHubソースコードを管理したいだけ)。

GitHub - indenkun/infun: This is a collection of R utilities functions for me, but maybe also for you.

install.packages("remotes")
remotes::install_github("indenkun/infun")

でインストールできる。詳しくはないが関数の紹介はREADMEに書いたつもり。

自分で使いたい関数をパッケージ化した感じで今後も適当に自分で使いたい関数があれば適宜入れていく。自作関数であっても汎用性があるものは適宜パッケージ化したほうが名前空間的にいいし、Rスクリプトファイルの紛失が防げる。

:追記終了