setsパッケージ
- setsパッケージの解説文書(こちら)
- 薀蓄
- 集合は大事
- JAVA, C++では扱える(ADTsというデータ型)、Pascal,Pythonは集合用のデータ型を持つ
- 要素探索を逐次チェックをしたりすると集合演算は遅いので、そうならない実装が大事
- Mathematica,MATLAB,Rでは標準装備でない
- Mathematica,MATLABはそうは言っても襲いながらも(?)集合的処理に線形処理で対応している
- Rはいわゆる集合演算的関数の変数が集合演算として不適当に実装されているこtもあることに注意
- だから、Rにはパッケージ作成が必要
- setsパッケージではJAVA,C++と同様のADTs的な扱いを採用している。
- 小規模での取扱ではそれほどのメリットはない(ベクトル・行列等、Rに基本実装しているオブジェクトで地味に書いても変わらない)が、大規模になったりすると、ハッシュテーブルや探索木を活用するのが適当なので、setsパッケージはそれに対応させてある
- 利用
- 集合を作る
s<-set(1,"A",list(3,2,1))
s {"A", 1, <<list(3)>>}
- 基本演算
- 空集合チェック
s<-set(1,2,3) s set_is_empty(s) s2<-set() s2 set_is_empty(s2)
> s<-set(1,2,3) > s {1, 2, 3} > set_is_empty(s) [1] FALSE > s2<-set() > s2 {} > set_is_empty(s2) [1] TRUE
-
- 一致・不一致
> s==s2 [1] FALSE > s!=s2 [1] TRUE
-
- 部分集合、含む・含まれる
> s<s2 [1] FALSE > s<=s2 [1] FALSE > s>s2 [1] TRUE > s>=s2 [1] TRUE
-
- 要素判定
> 3%e%s [1] TRUE > 4%e%s [1] FALSE
-
- 要素数を得る
> length(s) [1] 3
-
- 和集合、積集合、対称差(たいしょうさ、symmetric difference)
> s<-set(1,2,3,list(3:1),list(1:3)) > s2<-set(1,"a",list(1:3)) > s | s2 {"a", <<list(1)>>, <<list(1)>>, 1, 2, 3} > s & s2 {<<list(1)>>, 1} > s %D% s2 {"a", <<list(1)>>, 2, 3}
-
- 和集合、積集合、対称差(symmetric diff)を多数要素に計算する
> s<-set(1,2,3) > s2<-set(2,3,4) > s3<-set(3,4,5) > set_union(s,s2,s3) {1, 2, 3, 4, 5} > set_intersection(s,s2,s3) {3} > set_symdiff(s,s2,s3) {1, 3, 5}
-
- 相対的補集合(集合Xを全体としたときの補集合Y)
> s<-set(1,2,3) > s2<-set(2,3,4) > set_complement(s,s2) {4}
-
- カルテシアン積集合、べき集合
- カルテシアン積集合の要素は、(x,y)と()でくくられていて、タプル(tuple:順序つき要素組)
- カルテシアン積集合、べき集合
順序を気にするのに対して、べき集合の要素は、{x,y}と{}でくくられていて、集合であって、順序を気にしないことに注意
> s<-set(1,2,3) > s2<-set("a",2,"c") > s*s2 {(1, 2), (1, "a"), (1, "c"), (2, 2), (2, "a"), (2, "c"), (3, 2), (3, "a"), (3, "c")} > s^2 {(1, 1), (1, 2), (1, 3), (2, 1), (2, 2), (2, 3), (3, 1), (3, 2), (3, 3)} > s^2L {(1, 1), (1, 2), (1, 3), (2, 1), (2, 2), (2, 3), (3, 1), (3, 2), (3, 3)} > 2^s {{}, {1}, {2}, {3}, {1, 2}, {1, 3}, {2, 3}, {1, 2, 3}} > s*s2 == s2*s [1] FALSE > s2*s {(2, 1), (2, 2), (2, 3), ("a", 1), ("a", 2), ("a", 3), ("c", 1), ("c", 2), ("c", 3)} > s*s2<=s2*s [1] FALSE > s*s2>=s2*s [1] FALSE > (s*s2)==(s2*s) [1] FALSE > (s*s2)%D%(s2*s) {(1, 2), (1, "a"), (1, "c"), (2, 1), (2, 3), (2, "a"), (2, "c"), (3, 2), (3, "a"), (3, "c"), ("a", 1), ("a", 2), ("a", 3), ("c", 1), ("c", 2), ("c", 3)}
-
- べき集合のうち、要素数が特定の値のもの(組み合わせのこと)
> s<-set(1,2,3,4) > set_combn(s,2L) {{1, 2}, {1, 3}, {1, 4}, {2, 3}, {2, 4}, {3, 4}}
> s1<-set(1) > s2<-set(2,3) > s3<-set(3,4,5) > set(s1,s2,s3) {{1}, {2, 3}, {3, 4, 5}} > cl<-closure(set(s1,s2,s3),"union") > cl {{1}, {2, 3}, {1, 2, 3}, {3, 4, 5}, {1, 3, 4, 5}, {2, 3, 4, 5}, {1, 2, 3, 4, 5}} > reduction(cl) {{1}, {2, 3}, {3, 4, 5}} > s1<-set(1) > s2<-set(2) > s3<-set(3) > set(s1,s2,s3) {{1}, {2}, {3}} > cl2<-closure(set(s1,s2,s3),"union") > cl2 {{1}, {2}, {3}, {1, 2}, {1, 3}, {2, 3}, {1, 2, 3}} > reduction(cl2) {{1}, {2}, {3}} > cl3<-closure(set(s1,s2,s3),"intersection") > cl3 {{}, {1}, {2}, {3}} > reduction(cl3) {{}, {1}, {2}, {3}}
-
- 要素を一塊として扱う
> s<-set(1,2,3) > sum(s) [1] 6 > range(s) [1] 1 3 > sapply(s,cos) [1] 0.5403023 -0.4161468 -0.9899925 > for(i in s)print(i) [1] 1 [1] 2 [1] 3 > sapply(s,print) [1] 1 [1] 2 [1] 3 [1] 1 2 3