本文档描R中集合运算函数的功能。第一部分描述base包中的函数,第二部分描述dplyr包中的函数。


1. base包

A <- c(1,1:5)  # 集合A
B <- c(3:10)   # 集合B
# 集合并运算
union(A, B)
 [1]  1  2  3  4  5  6  7  8  9 10
# 集合交运算
intersect(A, B)
[1] 3 4 5
# 集合减运算
setdiff(A, B)
[1] 1 2
setdiff(B, A)
[1]  6  7  8  9 10
# 判断集合是否相等
setequal(A, B)
[1] FALSE
setequal(3:10, B)
[1] TRUE
# 判断元素是否归属
is.element(1, A)
[1] TRUE
is.element(A, B)  # 也可用A %in% B
[1] FALSE FALSE FALSE  TRUE  TRUE  TRUE
# base包中的集合运算函数对data.frame无能为力
DF1 <- data.frame(v1 = c("a","a","b","b","c"),
                  v2 = 1:5)
DF2 <- DF1[1:3, ]
print(DF1)
  v1 v2
1  a  1
2  a  2
3  b  3
4  b  4
5  c  5
print(DF2)
  v1 v2
1  a  1
2  a  2
3  b  3
union(DF1, DF2)
[[1]]
[1] a a b b c
Levels: a b c

[[2]]
[1] 1 2 3 4 5

[[3]]
[1] a a b
Levels: a b c

[[4]]
[1] 1 2 3
intersect(DF1, DF2)
data frame with 0 columns and 0 rows
setdiff(DF1, DF2)
  v1 v2
1  a  1
2  a  2
3  b  3
4  b  4
5  c  5
setequal(DF1[1:5,], DF1[5:1,])
[1] FALSE

2. dplyr包

library(dplyr)
# 集合并运算
dplyr::union(A, B)
 [1]  1  2  3  4  5  6  7  8  9 10
# 集合交运算
dplyr::intersect(A, B)
[1] 3 4 5
# 集合减运算
dplyr::setdiff(A, B)
[1] 1 2
dplyr::setdiff(B, A)
[1]  6  7  8  9 10
# 判断集合是否相等
dplyr::setequal(A, B)
[1] FALSE
dplyr::setequal(3:10, B)
[1] TRUE
dplyr::union(DF1, DF2)
  v1 v2
1  a  2
2  a  1
3  b  4
4  b  3
5  c  5
dplyr::intersect(DF1, DF2)
  v1 v2
1  a  1
2  a  2
3  b  3
dplyr::setdiff(DF1, DF2)
  v1 v2
1  b  4
2  c  5
dplyr::setequal(DF1[1:5,], DF1[5:1,])
TRUE

注:DF1,DF2必须为同一数据集的子集,上述函数才有效,否则会报错Error: not compatible