R语言笔记(二)

5 高级数据管理

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

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

5.1 一个数据处理难题

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

需要考虑的问题包括以下几点:

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

5.2 数值和字符处理函数

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

数学函数

常用的数学函数包括:

  • 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的指数函数。

统计函数

常用的统计函数包括:

  • 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的矩阵运算语言有着许多共同之处。

使用以下代码对矩阵或数据框的数值列进行均值为1、标准差为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中许多函数也是基于已由函数构成的,一个函数的结构大概如下:

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

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值