R实战 第三篇:数据处理

Posted 悦光阴

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了R实战 第三篇:数据处理相关的知识,希望对你有一定的参考价值。

在实际分析数据之前,必须对数据进行清理和转化,使数据符合相应的格式,提高数据的质量。数据处理通常包括增加新的变量、处理缺失值、类型转换、数据排序、数据集的合并和获取子集等。

一,增加新的变量

通常需要根据数据框中的现有列,按照特定的公式、业务逻辑,向数据框中新增变量,常用的操作符是:

  • 算术运算符是:+ - * /,求模(%%),整除(%/%),
  • 比较运算符是:不等是 !=,相等是 ==,
  • 逻辑运算符与(&)、或(|)和非(!)。

举个例子,有数据框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% 返回逻辑型向量,用法是:

  1. 用法 a %in% table  
  2. 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语言实战

以上是关于R实战 第三篇:数据处理的主要内容,如果未能解决你的问题,请参考以下文章

R学习笔记 第三篇:数据框

第三篇:R语言数据可视化之条形图

Linux实战第三篇:RHEL7.3 yum更换实战

攻防演习防御体系构建之第三篇之建立实战化的安全体系

Kafka消息队列大数据实战教程-第三篇(Kafka分区和副本的创建)

Kafka消息队列大数据实战教程-第三篇(Kafka分区和副本的创建)