結構色々あって面白い。自分が昔書いたやつが必要なくなる感じだ。
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