在实际分析数据之前,必须对数据进行清理和转化,使数据符合相应的格式,提高数据的质量。数据处理通常包括增加新的变量、处理缺失值、类型转换、数据排序、数据集的合并和获取子集等。
一,增加新的变量
通常需要根据数据框中的现有列,按照特定的公式、业务逻辑,向数据框中新增变量,常用的操作符是:
- 算术运算符是:+ - * /,求模(%%),整除(%/%),
- 比较运算符是:不等是 !=,相等是 ==,
- 逻辑运算符与(&)、或(|)和非(!)。
举个例子,有数据框mydata
mydata<-data.frame(x1=c(2,2,6,4),x2=c(3,4,2,8))
向数据框增加新的变量,通常的做法是:
attach(mydata) mydata$sumx<-x1+x2 mydata$meanx<-(x1+x2)/2 detach(mydata)
另外一个做法是使用transform()函数,该函数只用于数据框:
mydata<- transform(mydata ,sumx=x1+x2 ,meanx=(x1+x2)/2)
二,对现有变量重新编码
重新编码是根据一个变量或其他多个变量的现有值,对现有的变量重新赋值,常用于把错误的值替换为正确值。重编码语句是:
variable[condition] <- expression
该语句仅在condition的值为TRUE时,执行赋值操作:
mydata$x1[ mydata$x1<3 ]<- 1
也可以使用更为紧凑的写法
mydata<-within(mydata,{x1[x1<3]<- 1})
三,变量的重命名
查看数据框的变量名,函数names(df)返回变量名的向量:
names(mydata)
重命名现有的变量名,
names(df)[index] <- "new name" names(df)[start:end] <- c("new name"....)
plyr包中有一个rename()函数,可用于修改数据框的变量名,rename()函数的使用格式为:
rename(df,c(colname="newname",colname="newname",...))
四,数据框的变量存在缺失值
缺失值是指不可用值,以符号NA表示,缺失值是不可比较的,只能使用is.na()检查是否存在缺失值,通过函数na.omit()移除所有含有缺失值的观测。
dataset<-within(dataset,{var1<- ifelse(is.na(var1),0,var1)}) dataset<-na.omit(dataset)
举个例子,创建4行3列的矩阵m,并转换为数据框:
> d <-data.frame(matrix(sample(c(NA, 1:4), 12, replace = TRUE), 4)) > d X1 X2 X3 1 NA 4 1 2 1 2 NA 3 1 4 2 4 NA NA 4
1,把变量的缺失值替换为默认值
替换数据框中变量X1的缺失值,使用within()函数,不会修改数据框的数据,需要把函数返回的结果重新赋值给d对象:
> d <- within(d,{X1[is.na(X1)] <-0}) > d X1 X2 X3 1 0 4 1 2 1 2 NA 3 1 4 2 4 0 NA 4
2,当变量出现缺失值时,移除观测
使用函数 na.omit(),用于把数据框中变量为NA的观测移除,处理的结果中不任意一个观测中都不包含NA的变量值
> d <- na.omit(d) > d X1 X2 X3 1 0 4 1 3 1 4 2
五,数据排序
对数据框进行排序,常用的函数是order(),默认的排序方向是升序,在排序变量前边加一个减号,按照降序方向排序。
该函数返回的结果是特定变量在数据框中的行序号序列,行序号按照升序或降序排列。
举个例子,创建一个数据框d:
> d <-data.frame(matrix(sample(c(1:6), 12, replace = TRUE), 4)) > d X1 X2 X3 1 2 1 4 2 4 4 6 3 2 4 2 4 2 2 5
按照数据框的变量X3,获取观测的升序排列,依次为:序号为3的观测、序号为1的观测、序号为4的观测和序号为2的观测
> order(d$X3) [1] 3 1 4 2
按照观测的序号的排列,从数据框中按照行序号重新获取数据,就得到按照变量X3升序的有序结果:
> d[order(d$X3),,] X1 X2 X3 3 2 4 2 1 2 1 4 4 2 2 5 2 4 4 6
可以把排序操作写的更紧凑点:
dataset = dataset[with(dataset, order(var1, -var2)), , ...]
六,数据集的合并
把两个数据集合并为一个,这涉及到向数据框中添加列,向数据框中添加行。
1,向数据框中添加列
向数据框中添加列,可以使用merge()函数,也可以使用cbind()函数,这两个函数的区别是:
- cbind()函数是根据列进行合并,合并的前提是每个对象拥有相同的行数,以相同的顺序排序。
- merge()函数是根据列进行合并,该函数的功能类型关系型数据库的Join命令,不同要求每个对象拥有相同的行数,使用灵活。
Merge函数的语法定义:
merge(x, y, by = intersect(names(x), names(y)), by.x = by, by.y = by, all = FALSE, all.x = all, all.y = all, sort = TRUE, suffixes = c(".x",".y"), incomparables = NULL, ...)
参数注释:
- x,y:是进行合并的两个数据框对象;
- by:按照两个对象的名称相同的列进行合并;
- by.x,by.y:分别指定x对象和y对象匹配的列名;
- all:对于不满足匹配条件时,是否保留列值;如果设置为FALSE,那么相当于INNER JOIN命令,返回的结果集只保留匹配成功的数据行;如果设置为TRUE,那么相当于FULL JOIN,保留x和y中不匹配的数据行,并把不匹配的列值设置为NA;
- all.x,all.y:分别设置x和y是否保留列值;如果设置all.x=TRUE,all.y=FALSE,那么相当于LEFT JOIN命令,返回的结果集只保留x对象的数据行,不匹配的y对象的数据行行的列值设置为NA;如果设置为all.x=FALSE,all.y=TRUE,那么相当于RIGHT JOIN命令,返回的结果集只保留y对象的数据行,不匹配的x对象的数据行行的列值设置为NA。
- sort:返回的结果集是否排序,排序列是by参数的对象
- suffixes:后缀名,默认值是c(".x",".y"),当合并的两个对象拥有相同的列名时,R把相同的列名后面加上该后缀名,以唯一区分结果集的列名;
- incomparables:不能匹配的值
2,向数据框中添加行
使用rbind()函数,根据行进行合并,向数据框中添加数据行,相当于关系型数据库的求求并集。要求两个数据库必须拥有相同名称的变量,而变量的顺序可以不同。
七,选取子集
1,选择变量
从一个数据框中选择有限数量的变量,数据框中的元素是通过dataframe[rows_vector , colunms_vector],如果不设置行的下标(,),表示选择所有行,
mydata <- mydata[,c(col,,...)]
2,剔除变量
把特定的变量剔除,只选入剩余的变量。操作符 %in% 返回逻辑型向量,用法是:
- 用法 a %in% table
- a值是否包含于table中,为真时输出TURE,为假时输出FALSE
例如,mydata有四个变量c1,c2,c3,c4,myvars的结果是c(TRUE,FALSE,TRUE,FALSE),对该变量求非(!myvars)之后是 c(FALSE,TRUE,FALSE,TRUE),在根据数据框的下标来选入特定的变量。
myvars <- names(mydata) %in% c("c1","c3") mydata <- mydata[!myvars]
3,选入观测
选入观测,可以根据观测的序号来选择,也可以根据特定的条件来选择:
mydata <- mydata[1:5,,...] mydata <- mydata[mydata$c1<=5 & mydata$c2>=20,,...]
还有一个函数which,也能用于选入观测:
which(x, arr.ind = FALSE, useNames = TRUE)
which函数返回的是逻辑值的向量,which()函数的用法是:用法which(test),返回test为真值的位置(指针)。
4,根据条件选择子集
subset()函数是选择数据库的变量和观测最简单的方法,
mydata <- subset(mydata, c1<=5 & c2>=20, select=c("c1","c2",,,))
subset()函数的语法是:
subset(x, subset, select, drop = FALSE)
参数注释:
- x:数据框对象
- subset:该参数是逻辑表达式,对于数据框而言,该参数作用于数据行,用于选择数据行。
- select:要选择的变量构成的向量
- drop:逻辑值,要剔除的变量构成的向量
参考文档:
R语言实战