機略戦記

Maneuver warfare

[R] キーワード付き引数みたいな事がしたい

  • rubyで言うところのキーワード付き引数みたいな事がしたい。

結論

  • 普通に引数を定義するだけで、キーワード付き引数のように振る舞う。
function_argument_biheibia_test <- function(argument1, argument2) {
  print(argument2)
}
function_argument_biheibia_test(argument2='test_message')

# => "test_message"

[dplyr] group_byを行う時、集約に使うキーを変数で指定したい。

やりたい事

ここにirisがある。

> head(iris)
  Sepal.Length Sepal.Width Petal.Length Petal.Width Species
1          5.1         3.5          1.4         0.2  setosa
2          4.9         3.0          1.4         0.2  setosa
3          4.7         3.2          1.3         0.2  setosa
4          4.6         3.1          1.5         0.2  setosa
5          5.0         3.6          1.4         0.2  setosa
6          5.4         3.9          1.7         0.4  setosa

これをPetal.Widthgroup_byしてnをカウントしたい時はこうする。

> iris %>% group_by(Petal.Width) %>% summarise(n = n())
Source: local data frame [22 x 2]

   Petal.Width  n
1          0.1  5
2          0.2 29
3          0.3  7
...

今回は、Petal.Widthを使ってgroup_byしたが、これを動的に指定したい。

結論

group_by_を使う + キーは変数に入れておく。

> group_by_key <- "Petal.Width"
> iris %>% group_by_(group_by_key) %>% summarise(n = n())
Source: local data frame [22 x 2]

   Petal.Width  n
1          0.1  5
2          0.2 29
3          0.3  7

このコードで言うところのgroup_by_keyに任意のカラム名を入れる事でgroup_byに使うキーを動的に指定できる。

[R] 2つ文字列ベクターに対して全ての組み合わせを求めたい

結論

> expand.grid(c('a', 'b', 'c'), c('1', '2', '3'))
  Var1 Var2
1    a    1
2    b    1
3    c    1
4    a    2
5    b    2
6    c    2
7    a    3
8    b    3
9    c    3

説明

例えば、「10段階にカテゴライズされた年齢」と「性別」に対して組み合わせを求めたい時とかに使う。

プログラム実行中のある時点で処理を止め、止めた位置のコンテキストを維持したまま対話的にコードを実行したい(Rubyのbinding.pryみたいな事がしたい)

結論

止めたい位置でbrowser()を実行する。

例:

このようなスクリプトがあったとする。

a <- 1

止めたい位置にbrowser()を挿入する。

a <- 1
browser()

実行時にconsoleが起動し、対話的にコードを実行できる。

Browse[1]> a
[1] 1

説明

browser()が実行された箇所で参照できる変数や関数が自由にいじれる。

これはデバッグに大変便利。