R实战 第三篇:数据处理
在实际分析数据之前,必须对数据进行清理和转化,使数据符合相应的格式,提高数据的质量。数据处理通常包括增加新的变量、处理缺失值、类型转换、数据排序、数据集的合并和获取子集等。
一,增加新的变量
通常需要根据数据框中的现有列,按照特定的公式、业务逻辑,向数据框中新增变量,常用的操作符是:
- 算术运算符是:+ - * /,求模(%%),整除(%/%),求幂(^ 或 **)
- 比较运算符是:不等是 !=,相等是 ==,
- 逻辑运算符与(&)、或(|)和非(!)。
举个例子,有数据框mydata
mydata<-data.frame(x1=c(,,,),x2=c(,,,))
向数据框增加新的变量,通常的做法是:
attach(mydata)
mydata$sumx<-x1+x2
mydata$meanx<-(x1+x2)/
detach(mydata)
第二个方法是:使用transform()函数,该函数只用于数据框:
mydata<- transform(mydata
,sumx=x1+x2
,meanx=(x1+x2)/)
第三个方法是:使用within()函数,返回整个数据框:
mydata<- within(mydata,{
sumx <- x1+x2,
meanx <- (x1+x2)/
})
第四个方法是:使用dplyr包中的mutate()函数,通过name=value的方式来添加新列:
mydata<- mutate(mydata,
sumx = x1+x2,
meanx = (x1+x2)/
)
二,对现有变量重新编码
重新编码是根据一个变量或其他多个变量的现有值,对现有的变量重新赋值,常用于把错误的值替换为正确值。重编码语句是:
variable[condition] <- expression
该语句仅在condition的值为TRUE时,执行赋值操作:
mydata$x1[ mydata$x1< ]<-
也可以使用更为紧凑的写法
mydata<-within(mydata,{x1[x1<]<- })
注意:逻辑运算符等号是==
三,变量的重命名
查看数据框的变量名,函数names(df)返回变量名的向量:
names(mydata)
重命名现有的变量名,
names(df)[index] <- "new name"
names(df)[start:end] <- c("new name"....)
plyr包中有一个rename()函数,可用于修改数据框的变量名,rename()函数的语法是:
rename(x, replace, warn_missing = TRUE, warn_duplicated = TRUE)
参数 replace是一个命名向量,格式是c("colname"="newname",...),使用示例如下:
df <- rename(df,c("colname1"="newname","colname2"="newname"))
四,数据框的变量存在缺失值
缺失值是指不可用值,以符号NA表示,缺失值是不可比较的,只能使用is.na()检查是否存在缺失值,通过函数na.omit()移除所有含有缺失值的观测。
dataset<-within(dataset,{var1<- ifelse(is.na(var1),,var1)})
dataset<-na.omit(dataset)
举个例子,创建4行3列的矩阵m,并转换为数据框:
> d <-data.frame(matrix(sample(c(NA, :), , replace = TRUE), ))
> d
X1 X2 X3
NA
NA NA NA
1,把变量的缺失值替换为默认值
替换数据框中变量X1的缺失值,使用within()函数,不会修改数据框的数据,需要把函数返回的结果重新赋值给d对象:
> d <- within(d,{X1[is.na(X1)] <-})
> d
X1 X2 X3
NA
NA
2,当变量出现缺失值时,移除观测
使用函数 na.omit(),用于把数据框中变量为NA的观测移除,处理的结果中不任意一个观测中都不包含NA的变量值
> d <- na.omit(d)
> d
X1 X2 X3
五,数据排序
对数据框进行排序,常用的函数是order(),默认的排序方向是升序,在排序变量前边加一个减号,按照降序方向排序。
该函数返回的结果是特定变量在数据框中的行序号序列,行序号按照升序或降序排列。
举个例子,创建一个数据框d:
> d <-data.frame(matrix(sample(c(:), , replace = TRUE), ))
> d
X1 X2 X3
按照数据框的变量X3,获取观测的升序排列,依次为:序号为3的观测、序号为1的观测、序号为4的观测和序号为2的观测
> order(d$X3)
[]
按照观测的序号的排列,从数据框中按照行序号重新获取数据,就得到按照变量X3升序的有序结果:
> d[order(d$X3),]
X1 X2 X3
对多个列进行排序,其中按照X3列升序,X2列降序:
> d[order(d$X3, -d$X2),]
可以把排序操作写的更紧凑点:
dataset = dataset[with(dataset, order(var1, -var2)), , ...]
六,排名
使用rank()函数对向量的元素进行排名
rank(x, na.last = TRUE,
ties.method = c("average", "first", "last", "random", "max", "min"))
参数注释:
- x:向量
- na.last:控制如何对象NA的顺序,如果设置为TRUE,那么把缺失值排最后一位;如果设置为FALSE,把缺失值排在第一位;如果设置位NA,移除缺失值;
- ties.method:字符类型,用于指定如何处理相同值的排序,相同值构成的结构叫做ties。
The "first" method results in a permutation with increasing values at each index set of ties, and analogously "last" with decreasing values. The "random" method puts these in random order whereas the default, "average", replaces them by their mean, and "max" and "min" replaces them by their maximum and minimum respectively, the latter being the typical sports ranking.
例如,向数据框中增加排名字段Rank,该字段按照x1变量进行排名:
mydata<-data.frame(x1=c(,,,),x2=c(,,,))
mydata$Rank <- rank(mydata$x1,ties.method = "first") x1 x2 Rank
七,数据集的合并
把两个数据集合并为一个,这涉及到向数据框中添加列,向数据框中添加行。
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[:,,...]
mydata <- mydata[mydata$c1<= & mydata$c2>=20,,...]
还有一个函数which,也能用于选入观测:
which(x, arr.ind = FALSE, useNames = TRUE)
which函数返回的是逻辑值的向量,which()函数的用法是:用法which(test),返回test为真值的位置(指针)。
4,根据条件选择子集
subset()函数是选择数据库的变量和观测最简单的方法,
mydata <- subset(mydata, c1<= & c2>=, select=c("c1","c2",,,))
subset()函数的语法是:
subset(x, subset, select, drop = FALSE)
参数注释:
- x:数据框对象
- subset:该参数是逻辑表达式,对于数据框而言,该参数作用于数据行,用于选择数据行,其中,等于使用双等号(==)表示;
- select:要选择的变量构成的向量
- drop:逻辑值,要剔除的变量构成的向量
参考文档:
R实战 第三篇:数据处理的更多相关文章
- R实战 第三篇:数据处理(基础)
数据结构用于存储数据,不同的数据结构对应不同的操作方法,对应不同的分析目的,应选择合适的数据结构.在处理数据时,为了便于检查数据对象,可以通过函数attributes(x)来查看数据对象的属性,str ...
- R实战 第五篇:绘图(ggplot2)
ggplot2包实现了基于语法的.连贯一致的创建图形的系统,由于ggplot2是基于语法创建图形的,这意味着,它由多个小组件构成,通过底层组件可以构造前所未有的图形.ggplot2可以把绘图拆分成多个 ...
- R实战 第六篇:数据变换(aggregate+dplyr)
数据分析的工作,80%的时间耗费在处理数据上,而数据处理的主要过程可以分为:分离-操作-结合(Split-Apply-Combine),也就是说,首先,把数据根据特定的字段分组,每个分组都是独立的:然 ...
- R实战 第七篇:绘图文本表
文本表是显示数据的重要图形,一个文本表按照区域划分为:列标题,行标题,数据区,美学特征有:前景样式.背景央视.字体.网格线等. 一,使用ggtexttable绘图文本表 载入ggpubr包,可以使用g ...
- R实战 第十一篇:处理缺失值
在真实的世界中,缺失数据是经常出现的,并可能对分析的结果造成影响.在R中,经常使用VIM(Visualization and Imputation of Missing values)包来对缺失值进行 ...
- R实战 第八篇:重塑数据(reshape2)
数据重塑通常使用reshape2包,reshape2包用于实现对宽数据及长数据之间的相互转换,由于reshape2包不在R的默认安装包列表中,在第一次使用之前,需要安装和引用: install.pac ...
- Docker实战 | 第三篇:Docker安装Nginx,实现基于vue-element-admin框架构建的项目线上部署
一. 前言 在上一文中 点击跳转 通过IDEA集成Docker插件实现微服务的一键部署,但 youlai-mall 是前后端分离的项目,除了后端微服务的部署之外,当然还少不了前端工程的部署.所以本篇讲 ...
- R实战 第七篇:网格(grid)
grid包是R底层的图形系统,可以绘制几乎所有的图形.除了绘制图形之外,grid包还能对图形进行布局.在绘图时,有时候会遇到这样一种情景,客户想把多个代表不同KPI的图形分布到同一个画布(Page)上 ...
- (转)spring boot实战(第三篇)事件监听源码分析
原文:http://blog.csdn.net/liaokailin/article/details/48194777 监听源码分析 首先是我们自定义的main方法: package com.lkl. ...
随机推荐
- 网络编程之UDP编程
网络编程之UDP编程 UDP协议是一种不可靠的网络协议,它在通信的2端各建立一个Socket,但是这个Socket之间并没有虚拟链路,这2个Socket只是发送和接受数据的对象,Java提供了Data ...
- android adapter 中添加OnClickListener事件
public class SearchAutoAdapter extends BaseAdapter { private OnClickListener mOnClickListener; publi ...
- web开发概述
1 Web概述 Web,在英语中表示网页的额意思,它用于表示Internet主机上供外界访问的资源. 2 Web的分类 按照服务器上的资源分类: 静态资源:指的是web页面中供人们浏览的数据是始终不变 ...
- 关于awk的多文件处理
关于awk的多文件处理: awk的数据输入有两个来源,标准输入和文件,后一种方式支持多个文件,如1.shell的Pathname Expansion方式:awk '{...}' *.txt # *.t ...
- JAVA常用知识点总结---集合篇
一.Collection 与 Collections的区别:1. Collections:java.util.Collections 是一个包装类.它包含有各种有关集合操作的静态多态方法.此类不能实例 ...
- 安装linux下面用来配置网络,防火墙,系统服务等设置的图形小工具Setup
Setup命令是linux下面用来配置网络,防火墙,系统服务等设置的图形小工具.使用起来非常方便简单,可是centos\redhat最小化安装之后发现setup命令工具用不了. 接下来介绍如何安装se ...
- [一个脑洞] Candy?'s 不饱和度
update 2017.7.10 Candy?'s 不饱和度 题目背景 化学老师让同学们出题!昌老师担任有机组组长! Candy?出了一道数不饱和度的题目,昌老师不会做所以拒绝接受!!! 于是Cand ...
- BZOJ 3809: Gty的二逼妹子序列 & 3236: [Ahoi2013]作业 [莫队]
题意: 询问区间权值在$[a,b]$范围内种类数和个数 莫队 权值分块维护种类数和个数$O(1)-O(\sqrt{N})$ #include <iostream> #include < ...
- Google 搜索引擎语法
Google Hack原理很简单,就是利用搜索引擎强大的搜索能力,来查找一些存在漏洞的网站.要利用Google来查找网站的漏洞自然要学会Google这个搜索引擎的语法了.下面先给大家讲解一下Googl ...
- pygame写贪吃蛇
python小白尝试写游戏.. 学了点pygame不知道那什么练手好,先拿贪吃蛇开刀吧. 一个游戏可以粗略的分为两个部分: 数据(变量) 处理数据(函数,方法) 设计变量 首先预想下,画面的那些部分需 ...