R语言笔记(二)

2019年12月05日 阅读数:536
这篇文章主要向大家介绍R语言笔记(二),主要内容包括基础应用、实用技巧、原理机制等方面,希望对大家有所帮助。

5 高级数据管理

数据分析 BY 伦大锤   阅读量 1,948css

相对于基本数据管理,此处咱们将接触到R中多种数学、统计和字符处理函数,学习如何本身编写函数,包括循环和条件执行语句,以及了解数据的整合和概述方法、重塑和重构方法。git

5.1 一个数据处理难题

要讨论数值和字符处理函数,不妨先考虑一个数据问题。一组学生参加了数学、科学和英语考试,须要按照某种成绩衡量指标将三门科目的成绩组合起来并排序,将前20%的学生评定为A,接下来20%的学生评定为B,依次类推。最后,将全部学生按照字母顺序进行排序并输出。正则表达式

须要考虑的问题包括如下几点:api

  1. 三科的均值和标准差相去甚远,所以求平均值显然没有意义。在组合多门成绩以前,必须将其变换为可比较的单元;
  2. 将三科成绩组合以后,须要肯定一种标准来评定学生的排名;
  3. 表示姓名的字段只有一个,使得排序任务复杂化。为了正确地将其排序,须要将姓和名拆开。

5.2 数值和字符处理函数

R中数据处理最为重要的函数包括数值(数学、统计、几率)函数和字符处理函数。数组

数学函数

经常使用的数学函数包括:app

  • abs(x):绝对值;
  • sqrt(x):平方根;
  • ceiling(x):不小于x的最小整数;
  • floor(x):不大于x的最大整数;
  • trunc(x):向0的方向截取x的整数部分;
  • round(x, digits=n):将x舍入为指定位的小数;
  • signif(x,digits=n):将x舍入为指定的有效数字位数;
  • cos(x)、sin(x)、tan(x)、acos(x)、asin(x)、atan(x)、cosh(x)、sinh(x)、tanh(x)、acosh(x)、asinh(x)、atanh(x):三角函数;
  • log(x,base=n):对x取以n为底的对数;
  • log(x):对x取以e为底的对数;
  • log10(x):对x取以10为底的对数;
  • exp(x):e的指数函数。

统计函数

经常使用的统计函数包括:ide

  • mean(x):平均数;
  • median():中位数;
  • sd(x):标准差;
  • var(x):方差;
  • mad(x):绝对中位差;
  • quantile(x,probs):求分位数,其中x为待求分位数的数值型向量,probs为一个由[0,1]之间的几率值组成的数值向量;
  • range(x):求值域;
  • sum(x):求和;
  • diff(x,lag=n):滞后差分;
  • min(x):求最小值;
  • max(x):求最大值;
  • scale(x,center=TRUE,scale=TRUE):为数据对象x按列进行中心化或标准化。

其中许多函数都提供了丰富的可选参数,能够进一步影响输出结果。例如如下截尾平均数,丢弃了最大5%和最小5%的数据和全部缺失值后获得算数平均值。函数

如下代码演示了计算某个数值向量均值和标准差的两种方式:工具

不难发现,R中公式的写法和相似Matlab的矩阵运算语言有着许多共同之处。性能

使用如下代码对矩阵或数据框的数值列进行均值为一、标准差为0的标准化:

或者任意均值和标准差:

若是仅对指定列处理,则使用transform()函数:

几率函数

概览函数和统计函数相似,可是一般用来生成特征已知的模拟数据,以及在用户编写的统计函数中计算几率值。

R中的每一个概览函数都对应四个具体函数:d(密度函数)、p(分布函数)、q(分位数函数)和r(生成随机数)。

R经常使用几率函数

以正态分布为例,若是不指定均值和标准差,将会生成标准正态分布(均值为0,标准差为1),相应的密度函数(dnorm)、分布函数(pnorm)、分位数函数(qnorm)和随机生成函数(rnorm)分别以下。

在每次生成伪随机数的时候,函数都会使用一个不一样的种子,所以也会产生不一样的结果。能够经过函数set.seed()显式指定种子,使得以前的结果能够重现(reproducible)。重现数据有助于建立会在将来取用的,以及可与他人分享的随机示例数据。

使用MASS包中的mvrnorm()函数能够生成来自给定均值向量和协方差矩阵的多元正态分布,如下是一个生成知足指定三元正态分布的例子。

字符处理函数

数学和统计函数用于处理数值型数据,而字符处理函数用于从文本型数据中抽取信息。

  • nchar(x):计算x中的字符数量;
  • substr(x, start, stop):提取或替换子串;
  • grep(pattern, x, ignore.case=FALSE, fixed=FALSE):在x中搜索某种模式,fixed=FALSE则pattern为一个正则表达式,不然pattern为一个文本字符串,返回值为匹配的下标;
  • sub(pattern, replacement, x, ignore.case=FALSE, fixed=FALSE):在x中搜索某种模式并替换;
  • strsplit(x, split, fixed=FALSE):在split处分隔字符向量x中的元素;
  • paste(…, sep=””):链接字符串,分隔符为sep。paste(“x”, 1:3, sep=””)返回值为c(“x1”, “x2”, “x3”),paste(“x”, 1:3, sep=”M”)返回值为c(“xM1”, “xM2”, “xM3”);
  • toupper(x):大写转换;
  • tolower():小写转换。

其余实用函数

  • length(x):x的长度;
  • seq(from, to, by):生成一个序列,by为步长;
  • rep(x, n):将x重复n次;
  • cut(x ,n):将连续型变量x分割为n个水平的因子;
  • pretty(x, n):经过选取n+1个等间距的取整值,将一个连续型变量分割为n个区间;
  • cat(…, file=”mayflies”, append=TRUE):链接…中的对象,并将其输出到屏幕上或文件中。

在R中,函数能够应用到一系列数据对象上,包括标量、向量、矩阵、数组和数据框(和Matlab相似)。若是但愿函数应用于矩阵的各行或者各列,能够考虑apply()函数。

MARGIN是维度的下标,1表示行、2表示列,FUN能够是内置函数或者你本身编写的函数,…为可选参数。

和apply()应用于矩阵同样,lapply()和sapply()则将函数应用于列表上。

5.3 数据处理难题的一套解决方案

回到咱们以前的问题,组合三门成绩、按衡量指标排名、按区间分段打分、按姓名排序。

最后查看roster,你应当获得以下结果。

学生成绩数据处理结果

5.4 控制流

在正常状况下,R程序中的语句是从上至下执行的。固然有时候你须要控制程序的执行流,即便用条件和循环。

为了理解贯穿接下来内容的语法示例,请牢记如下概念:

  • 语句(statement)是一条单独的R语句或一组复合语句(包含在{}中的一组R语句,使用分号分割);
  • 条件(cond)是一条最终被解析为逻辑值的表达式;
  • 表达式(expr)是一条数值或字符串的求值语句;
  • 序列(seq)是一个数值或字符串序列。

重复和循环

循环结构重复地执行一个或一系列语句,直到某个条件再也不为真,循环结构包括for循环和while循环。

在如下的例子中,单词Hello被输出了10次。

使用循环的时候,记得在循环里修改标记量,避免致使死循环。

在处理大数据集中的行和列时,R中的循环可能比较低效耗时,应该尽量使用R中内建的数值/字符处理函数和apply()族函数。

条件执行

在条件执行结构中,一条或一组语句仅在知足指定条件时执行。条件执行结构包括if-else、ifelse和switch。

再给出一个使用switch的例子,虽然简单但清晰说明了switch的使用方法。

5.5 用户自编函数

R最大的优势之一就是支持用户自行添加函数,R中许多函数也是基于已由函数构成的,一个函数的结构大概以下:

函数中的对象只在函数内部使用(记得{}的做用吗?),返回对象的数据类型是任意的,从标量到列表皆可。

要查看此函数的运行状况,则须要生成一些测试数据并调用。

在所得结果中,y$center为均值(0.00184),y$spread为标准差(1.03),而且没有输出结果;z$center为中位数(-0.0207),z$spread为绝对中位差(1.001),而且还会在屏幕上打印信息。

再来看一个使用了switch的用户自编函数,该函数可让用户选择输出当天日期的格式。

switch中的最后一条语句给出了如何处理错误(或其余意料以外)的输入。除此以外,还有一些函数能够用来为函数添加错误捕获和纠正功能,如使用warning()生成一条错误提示信息,用message()生成一条诊断信息,用stop()中止当前表达式的执行并提示错误。若是但愿了解更多关于调试程序的内容,请阅读Duncan Murdoch整理的“Debugging in R”。

5.6 整合与重构

R中提供了许多用于整合(aggregate)和重塑(reshape)数据的强大方法,整合数据是指将多组观测替换为根据这些观测计算的描述性统计量,重塑数据是指经过修改数据的结构(行和列)来决定数据的组织方式。

如下例子中,将会使用已包含在R基本安装中的数据框mtcars。该数据集从Motor Trend杂志(1974)提取,描述了34种车型的设计和性能特色(汽缸数、排量、马力、每加仑汽油行驶的英里数)。

转置

使用函数t()便可对一个矩阵或数据框进行转置,对于后者,行名将成为列名。

整合数据

在R中使用一个或多个by变量和一个预先定义好的函数来整合(collapse)数据十分容易。

其中x为待整合的数据对象,by是一个变量名组成的列表,这些变量将被去掉以造成新的观测,FUN是用来计算描述性统计量的标量函数,它将被用来计算新观测中的值。如下代码根据汽缸数和档位数整合mtcars数据,并返回各个数值型变量的均值。

将会获得如下结果。如何理解呢?例如第一行,拥有4个气缸和3个档位的车型,每加仑汽油行驶英里数(mpg)均值为21.5。须要注意的是,by中的参数必须写在一个列表中(即便只有一个参数)。

aggregate函数处理结果

Reshape包

reshape包是一套重构和整合数据集的万能工具。因为reshape包并未内置在R的标准安装中,因此有必要经过install.packages(“reshape”)进行安装。

咱们的操做大概包括两部分:融合(melt),使得每一行都是一个惟一的标识符和变量的组合;重铸(cast),将数据集变成任何须要的形状。接下来代码中,将处理如下样例数据。

测试样例数据

融合

融合使得每一个测量变量独占一行,行中必须带有惟一肯定该测量的标识符变量。

注意,必须指定要惟一肯定每一个测量所需的变量(ID和Time),而表示测量变量名的变量(X1和X2)将由程序自动建立。

既然已经拥有了融合后的数据,如今即可以使用cast()函数将其重铸为任意形状了。

重铸

cast()函数读取已融合的数据,并使用提供的公式和一个(可选的)用于整合数据的函数将其重铸。

接受的公式形如:

rowvar1+rowvar2+…定义了要去掉的变量集合,以肯定各行的内容;colvar1+colvar2+…定义了要去掉的变量集合,以肯定各列的内容。下图给出了使用cast()函数处理样例数据的例子。

melt-cast使用示例

6 基本图形

数据分析 BY 伦大锤   阅读量 1,059

分析数据要作的第一件事情,就是观察它。对于每一个变量,哪些值是最多见的?值域是大是小?是否有异常观测?变量能够为连续型或类别型,咱们将探索如何使用条形图、饼图、扇形图、直方图、核密度图、箱线图、小提琴图和点图等来分析和展现变量。

6.1 条形图

条形图经过垂直或水平的条形来展现类别型变量的分布(频数)。

其中的height是一个向量或一个矩阵。在接下来的例子中,将使用到vcd包中带有的Arthritis数据框,其描述了一项探索类风湿性关节炎新疗法研究的结果。

简单的条形图

当height为一个向量时,向量值便肯定了各条形的高度并绘制一幅垂直的条形图。使用参数horiz=TRUE则生成一幅水平条形图,还可使用main、xlab和ylab等图形参数。

在关节炎研究中,变量Improved记录了对每位接受了安慰剂或药物治疗的病人的治疗效果。其中28人有了明显改善,14人有部分改善,而42人没有改善。

其实若是要绘制的类别型变量是一个因子或有序型因子,就能够直接使用函数plot()快速建立一幅垂直条形图。因为Arthritis$Improved是一个因子,所以如下代码也能够达到一样效果。

堆砌条形图和分组条形图

若是height是一个矩阵而不是一个向量,则绘图结果将是一幅堆砌条形图或分组条形图。beside默认为FALSE表示堆砌,不然将分组。考虑治疗类型和改善状况的列联表:

第一个barplot函数绘制了一幅堆砌条形图,而第二个绘制了一幅分组条形图。图中图例和条形图叠加了,不过这能够经过格式化和放置图例的方法解决,故不用担忧。

均值条形图

条形图并不必定要基于计数数据或频率数据,也可使用数据整合函数并将结果传递给barplot()函数,来建立表示均值、中位数、标准差等条形图。

条形图的微调

有多种方法能够微调条形图的外观:

  • 随着条数的增多,可使用cex.names减少字号避免标签重叠;
  • name.arg容许用一个字符向量指定条形的标签名;
  • 其余通用图形参数。

如下代码中,旋转了条形的标签(las)、修改了标签文本、增长了y边界的大小(mar)、缩小了字体大小(cex.names)。

棘状图

还有另外一种特殊的条形图:棘状图(spinogram)。棘状图对堆砌条形图进行了重缩放,使得每一个条形的高度均为1,每一段的高度表示所占比例。棘状图可由vcd包中的spine()绘制:

经过棘状图能够看出,治疗组和安慰剂组相比,得到显著改善的患者比例更高。

6.2 饼图

虽然饼图在商业世界中使用普遍,可是多数统计学家却并不支持它,由于相对于饼图的面积,人类对条形图或点图中的长度判断更加精确。也许是由于这个缘由,R中饼图的选项和其余统计软件相比十分有限。

其中x是一个非负数值向量,表示各个扇形的面积,labels则是各扇形标签的字符型向量。如下代码绘制了三幅饼图,最简单的饼图、显示百分比的饼图和三维饼图。

饼图让比较各扇形的值变得困难,除非这些值被附加在标签上。为了弥补这一缺点,产生了一种饼图的变种:扇形图。扇形图为用户提供了一种同时展现相对数量和相互差别的方法,各个扇形相互叠加而且拥有不一样半径,从而使得全部扇形都是可见的。

6.3 直方图

直方图经过在X轴上将值域分割为必定数量的组,在Y轴上显示相应值的频数,展现了连续型变量的分布。使用如下函数建立直方图:

x为一个由数据值组成的数值向量,参数freq=FALSE表示根据几率密度而不是频数绘制图形,参数breaks用于控制组的数量。

第一幅直方图未指定任何选项,共建立了五个组而且显示了默认的标题和坐标轴标签;第二幅直方图共12个分组,并使用红色填充条形;第三幅直方图保留了第二幅图的内容,并叠加了一条密度曲线(density)和轴须图(rug),密度曲线是数据分布一个的核密度估计,而轴须图是实际数据值的一种一维呈现方式;第四幅图和第二幅相似,还有一条叠加的正态曲线和一个将图形围绕起来的盒型。

6.4 核密度图

核密度估计是用于估计随机变量几率密度函数的一种非参数方法。

其中x为一个数值型向量,因为plot()函数会建立一幅新的图形,因此要向一幅已经存在的图形上叠加一条密度曲线时,可使用lines()函数。

第一幅图是默认设置建立的最简图形,而第二幅图中添加了标题,并将曲线修改为蓝色、使用实心红色填充了曲线下方的区域、添加了棕色的轴须图。

使用sm包中的sm.density.compare()函数能够向图形叠加两组或更多核密度图,格式为:

其中x为一个数值型向量,factor为一个分组变量。如下代码比较了拥有4个、6个或8个汽缸车型的每加仑汽油行驶英里数。