R中包含了一些方便的集合运算,主要由:
Ю union(x, y):集合x和y的并集
Ю intersect( x, y ):集合x和y的交集
Ю setdiff(x, y):集合x和y的差集,即所有属于集合x但不属于集合y的元素组成的集合
Ю setequal(x, y):检验集合x和y是否相等
Ю c %in% y:成员,检验c是否为集合y中的元素
Ю choose(x, y):从含有n个元素的集合中选取含有k个元素的子集的数目。
> x <- c( 1, 2, 5 )
> y <- c( 5, 1, 8, 9 )
> union( x, y )
[1] 1 2 5 8 9
> intersect( x, y )
[1] 1 5
> setdiff( x, y )
[1] 2
> setdiff( y, x )
[1] 8 9
> setequal( x, y )
[1] FALSE
> setequal( x, c( 1, 2, 5 ) )
[1] TRUE
> 2 %in% x
[1] TRUE
> 2 %in% y
[1] FALSE
> choose( 5, 2 )
[1] 10
我们可以很方便的使用这些函数的组合,来编写得到自己想要的结果。例如,编程计算两个集合的对称差,也就是只属于这两个集合其中之一的元素组成的集合,我们可以方便地调用setdiff(x, y)和union(x, y)函数来完成,代码如下:
> symdiff <- function( x, y ){
+ sdfxy <- setdiff( x, y )
+ sdfyx <- setdiff( y, x )
+ return ( union( sdfxy, sdfyx ) )
+ }
> x <- c( 1, 2, 5, 8 )
> y <- c( 5, 1, 9, 4 )
> symdiff( x, y )
[1] 2 8 9 4
函数combn()用于产生集合元素的组合。例如,找出集合{1,2,3}中含有2个元素的子集:
> c32 <- combn( 1:3, 2 )
> c32
[,1] [,2] [,3]
[1,] 1 1 2
[2,] 2 3 3
> class( c32 )
[1] "matrix"
输出的结果是按列排列的。集合{1,2,3}中含有2个元素的子集为{1,2}、{1,3}、{2,3}。
combn()函数也允许用户指定一个函数,作用于挑选出的每个组合。
> combn( 1:3, 2, sum )
[1] 3 4 5