読者です 読者をやめる 読者になる 読者になる

Rで集合を扱うsetsパッケージで遊ぶ

R

結構色々あって面白い。自分が昔書いたやつが必要なくなる感じだ。
www.yasuhisay.info

インスールなど

install.packages("sets")
library(sets)
#library(help=sets)

集合の基本演算

Rのbaseパッケージ(かな)にも集合演算はあるんだけど、listを使わないといけなくって面倒で仕方がない。でも、このset関数だと楽な感じだな。

> A <- set(1) 
> B <- set("1") 
> A | B 
{"1", 1}
> A & B 
{}

部分集合であるかとか、要素として持つかとか調べることもできる。便利すぐる。

> set(1) != set(2)
[1] TRUE
> set(1) <= set(1, 2)
[1] TRUE
> set_contains_element(set(1, 2, 3), 1)
[1] TRUE

羃集合とか

「2^S」で生成とかすごい。あと、すぐどっかにコピペして使えそうな感じで出力してくれるもの助かるな。自前の時はすっごい泥処理してたし。外積作って、それに関数適用とかもできてすばらしい。関数を投げることができるのがきいてくる。

> S <- set(1, 2, 3)
> (PS <- 2^S)
{{}, {1}, {2}, {3}, {1, 2}, {1, 3}, {2, 3}, {1, 2, 3}}
> set_outer(PS, PS, FUN = set_is_subset)
             {}   {1}   {2}   {3} {1, 2} {1, 3} {2, 3} {1, 2, 3}
{}         TRUE  TRUE  TRUE  TRUE   TRUE   TRUE   TRUE      TRUE
{1}       FALSE  TRUE FALSE FALSE   TRUE   TRUE  FALSE      TRUE
{2}       FALSE FALSE  TRUE FALSE   TRUE  FALSE   TRUE      TRUE
{3}       FALSE FALSE FALSE  TRUE  FALSE   TRUE   TRUE      TRUE
{1, 2}    FALSE FALSE FALSE FALSE   TRUE  FALSE  FALSE      TRUE
{1, 3}    FALSE FALSE FALSE FALSE  FALSE   TRUE  FALSE      TRUE
{2, 3}    FALSE FALSE FALSE FALSE  FALSE  FALSE   TRUE      TRUE
{1, 2, 3} FALSE FALSE FALSE FALSE  FALSE  FALSE  FALSE      TRUE
> set_outer(PS, PS, FUN = "==")
             {}   {1}   {2}   {3} {1, 2} {1, 3} {2, 3} {1, 2, 3}
{}         TRUE FALSE FALSE FALSE  FALSE  FALSE  FALSE     FALSE
{1}       FALSE  TRUE FALSE FALSE  FALSE  FALSE  FALSE     FALSE
{2}       FALSE FALSE  TRUE FALSE  FALSE  FALSE  FALSE     FALSE
{3}       FALSE FALSE FALSE  TRUE  FALSE  FALSE  FALSE     FALSE
{1, 2}    FALSE FALSE FALSE FALSE   TRUE  FALSE  FALSE     FALSE
{1, 3}    FALSE FALSE FALSE FALSE  FALSE   TRUE  FALSE     FALSE
{2, 3}    FALSE FALSE FALSE FALSE  FALSE  FALSE   TRUE     FALSE
{1, 2, 3} FALSE FALSE FALSE FALSE  FALSE  FALSE  FALSE      TRUE

直積

> set(1,2,3) * set("a","b","c")
{(1, "a"), (1, "b"), (1, "c"), (2, "a"), (2, "b"), (2, "c"), (3, "a"),
 (3, "b"), (3, "c")}

注意点

添字とかでアクセスができないようにしてある。sapply、lapply、forを通してなら触れるよって書いてあった。

> set(1,2,3)[[1]]
 以下にエラー `[[.set`(set(1, 2, 3), 1) : 
  Subscripting of sets is only defined using labels.

こんな感じ。そこまで厳密に再現しなくっても。

Because set elements are unordered, it is not sensible to use positional subscripting. However, it
is possible to iterate over al l elements using for() and lapply()/sapply().

こんな感じかなー?ここだけ気にいらなかった。

> as.list(set(1,2,3))[[1]]
[1] 1