本文档描R中集合运算函数的功能。第一部分描述base包中的函数,第二部分描述dplyr包中的函数。
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
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。