R语言基础函数中有一个sets集合元素集合,里面包含有各种集合元素,下面我们举个例子来介绍,假设有两个数列x和y
set.seed(123)
(x <- c(sort(sample(1:20, 9)), NA))
## [1] 2 3 5 6 10 11 14 15 19 NA
(y <- c(sort(sample(3:23, 7)), NA))
## [1] 5 7 10 11 12 16 22 NA
union函数就是把两个数列合并
union(x, y)
## [1] 2 3 5 6 10 11 14 15 19 NA 7 12 16 22
intersect函数就是取两个数列的交集
intersect(x, y)
## [1] 5 10 11 NA
setdiff函数就是求数列减去交集的这部分,注意一下setdiff(x, y)和setdiff(y, x)是不同的.setdiff(x, y)是x数列减去x数列和y数列交集的部分。
setdiff(x, y)
## [1] 2 3 6 14 15 19
setdiff(y, x)
## [1] 7 12 16 22
setequal函数是判断x和y这两个数据集是否完全一样
setequal(x, y)
## [1] FALSE
我们今天主要来介绍一下setdiff函数,利用这个函数的减法功能,可以在设计函数中有些用途,我们先导入我们的早产数据看一下变量名。
bc<-read.csv("E:/r/test/zaochan.csv",sep=',',header=TRUE)
dput(names(bc))
## c("id", "low", "age", "lwt", "race", "smoke", "ptl", "ht", "ui",
## "ftv", "bwt")
我们先看一下bc的数据结构
head(bc,6)
## id low age lwt race smoke ptl ht ui ftv bwt
## 1 85 0 19 182 black nonsmoker 0 0 1 0 2523
## 2 86 0 33 155 other nonsmoker 0 0 0 3 2551
## 3 87 0 20 105 white smoker 0 0 0 1 2557
## 4 88 0 21 108 white smoker 0 0 1 2 2594
## 5 89 0 18 107 white smoker 0 0 1 0 2600
## 6 91 0 21 124 other nonsmoker 0 0 0 0 2622
假设x和y分布是两个字符串向量
x<-c("id", "low", "age", "lwt", "race", "smoke", "ptl", "ht", "ui",
"ftv", "bwt")
y<-c("id")
x
## [1] "id" "low" "age" "lwt" "race" "smoke" "ptl" "ht" "ui"
## [10] "ftv" "bwt"
y
## [1] "id"
假设我们想从x字符串中删掉id这个变量
setdiff(x, y)
## [1] "low" "age" "lwt" "race" "smoke" "ptl" "ht" "ui" "ftv"
## [10] "bwt"
这样就轻易把id这个变量删除了,可有人会问,这个有什么用。在我们进行R语言编程中,可以使用它来删除变量,构造数据。假设我想写一个R的程序,能通过删减变量名改变数据结构
datchi<-function(data,dropvar) {
name<-dput(names(data))
dropvar<-dropvar
cname<-setdiff(name, dropvar)
data<-data[,cname]
data
}
程序很简单,dropvar就是我们想删掉的变量名,假设数据中我们不想要id这个数据
dat<-datchi(bc,"id")
## c("id", "low", "age", "lwt", "race", "smoke", "ptl", "ht", "ui",
## "ftv", "bwt")
head(dat,6)
## low age lwt race smoke ptl ht ui ftv bwt
## 1 0 19 182 black nonsmoker 0 0 1 0 2523
## 2 0 33 155 other nonsmoker 0 0 0 3 2551
## 3 0 20 105 white smoker 0 0 0 1 2557
## 4 0 21 108 white smoker 0 0 1 2 2594
## 5 0 18 107 white smoker 0 0 1 0 2600
## 6 0 21 124 other nonsmoker 0 0 0 0 2622
多删几个也是可以的
dat<-datchi(bc,c("id", "low", "age"))
## c("id", "low", "age", "lwt", "race", "smoke", "ptl", "ht", "ui",
## "ftv", "bwt")
head(dat,6)
## lwt race smoke ptl ht ui ftv bwt
## 1 182 black nonsmoker 0 0 1 0 2523
## 2 155 other nonsmoker 0 0 0 3 2551
## 3 105 white smoker 0 0 0 1 2557
## 4 108 white smoker 0 0 1 2 2594
## 5 107 white smoker 0 0 1 0 2600
## 6 124 other nonsmoker 0 0 0 0 2622
这个只是一个粗浅的应用,在设计R包程序中,我们可以使用分组别变量进行加和,然后再与数据的全部变量进行比较,这样可以得出全部变量中是否有异常数据,还有一些其他的用法,有空再聊聊。