从一个数据处理难题来引入数值和字符处理函数的讨论问题,如下图。
一组学生参加考试,考试科目分别为:数学、科学和英语。现在需要给学生确定单一的成绩衡量标准,首先将三门科目的成绩组合起来并排序,然后将前20%的学生评定为A,接下来20%的学生评定为B,依次类推。最后,将所有学生按照字母顺序进行排序并输出。
R语言中数据处理最重要的函数:数值(数学、统计、概率)函数和字符处理函数。
数值(数学、统计、概率)函数用在向量、矩阵、数据框时,单独用于其中每一个独立的值。
许多统计函数都拥有可以影响输出结果的可选参数,比如下面这行代码:
#trim为截尾平均数,下面的代码表示去除最大5%和最小5%的数据(即异常值)和所有缺失值后的算术平均数
计算某一数值向量的均值和标准差,有两种不同的方法,详见以下代码:
R语言中的函数sd()除以的是向量长度(元素数)n减去1,即n-1。
以下代码对矩阵或数据框的数值列进行均值为1、标准差为0的标准化:
或者任意均值和标准差:
如果仅对指定列处理,则使用:
与统计函数类似,但通常用来生成特征已知的模拟数据,以及在用户编写的统计函数中计算概率值。常见的概率函数如下:
R语言中所有的概率函数均对应四个具体函数:d(密度函数)、p(分布函数)、q(分位数函数)和r(生成随机数)。以上图中的正态分布(norm)为例,如果不指定均值和标准差,将生成标准正态分布(即均值为0,标准差为1),相应的密度函数(dnorm)、分布函数(pnorm)、分位数函数(qnorm)和随机生成函数(rnorm)分别如下:
*注:函数pretty(x, N)的含义是对变量x进行美观分割,主要是将连续变量 x 分割为 N 个区间(N+1 个端点),并使端点为取整值,常常在绘图中使用。后面将提到。
#位于z=1.96左侧的标准正态曲线下方面积?分布函数p
#均值为500,标准差为100正态分布的0.9分位点的值?分位数函数q
#生成50个均值为50,标准差为10的正态随机数?随机生成函数r
每次生成伪随机数时,函数都会使用一个不同的种子,因此会产生不同的结果。但实际中常常需要让随机结果重现(reproducible),为了实现结果重现可以通过函数set.seed()指定种子。
随机结果重现创建一些固定的随机示例数据,其目的主要是便于之后随时取用并与他人共享。
以下用均匀分布函数unif()生成在0-1区间服从均匀分布的伪随机数来举例:
函数set.seed()后的数字可以自己随意设置,随机数种子相当于锚定。
MASS包中的函数mvrnorm()可以生成给定均值向量和协方差矩阵的多元正态分布,调用格式为:
假设从如下所示的三元正态分布中抽取500个观测
数学函数、统计函数和概率函数用于处理数值型数据,而利用字符处理函数可以从文本型数据中抽取信息。
*注:函数grep()、函数sub()和函数strsplit()能够搜索某个文本字符串(fixed=TRUE)或某个正则表达式(fixed=FALSE, 默认值为FALSE)。正则表达式为文本模式的匹配提供了一套清晰而简练的语法。例如:
可匹配任意以0个或1个h或c开头、后接at的字符串。因此,此表达式可以匹配hat、cat和at,但 不会匹配bat。
更多关于正则表达式的内容,可以参考维基百科(、)。
关于函数cut()更多内容,详见
还有一个重要的实用函数,函数cat(),详细情况如下:
*注1:例子中用到了多种转义字符:\b表示键盘中Backspace的功能——退格,\n表示键盘中回车的功能——另起一行,\t表示键盘中Tab的功能——制表符,\'表示单引号。
*注2:第二行缩进了一个空格。当 函数cat() 输出连接后的对象时,会将每一个对象都用空格分开,这就是在句号之前使用退格转义字符\b的原因。否则代码运行的结果将变为
句号前面多了一个空格。同样的,如果要删除第二行的缩进应在"isn\'t R"之前增加退格转义字符\b。 六、将函数应用于矩阵和数据框在R中,函数可以应用到一系列数据对象上,包括标量、向量、矩阵、数组和数据框。举例如下:
最后一行代码中使用函数mean()得到的是矩阵c中全部12个元素的均值。
如果希望求的是各行的均值或各列的均值应该怎么办呢?
利用函数apply()可以将其他函数应用于矩阵的各行或者各列
其中,x 为数据对象,MARGIN是维度的下标,FUN是应用于x的各类R语言函数(甚至包括自己定义的函数),而...是指任何想改变FUN的参数。如果x是矩阵或数据框, 那么MARGIN=1表示矩阵或数据框的行,MARGIN=2表示矩阵或数据框的列。
#随机正态分布函数rnorm生成6行5列包含30个元素的矩阵
#计算矩阵mydata每一行的均值,MARGIN=1表示矩阵或数据框的行
#计算矩阵mydata每一列的均值,MARGIN=1表示矩阵或数据框的列
#参数trim=0.2表示去除最大20%和最小20%的异常值,即截尾均值仅选择了中间60%的数据
函数apply()可把函数应用到数组的某个维度上,而函数lapply()和函数sapply() 则可将函数应用到列表(list)上,后续的内容应该会经常遇到。
由函数apply()衍生出了一系列函数,被称为函数apply()家族,更多详细信息在中查看。另外,在中可以查看函数apply()家族中函数tapply()详细的实际案例。
数据处理难题的一套解决方案
现在看一下开头提出的问题:将学生的各科考试成绩组合为单一的成绩衡量指标进行排名、基于相对名次(以20%为区间标准)给出分段评分、根据学生姓氏和名字的首字母排序。以下代码提供了一套解决方案:
运行代码后,查看roster,可得到如下结果
以上代码的分步骤解读:
一、利用函数options()设置为小数点后保留两位小数,使输出更易阅读。
二、输入原始数据,并构建数据框
三、由于数学、科学和英语成绩的均值和标准差相差实在太大,在组合之前需要将三者变得可比较——将三者的列向量标准化,用单位标准差来表示。
#利用函数scale()对数据框中的数学、科学、英文成绩列向量(第2列到第4列)进行均值为1、标准差为0的标准化
四、利用函数apply()将函数mean()应用到数据框z计算每一行的均值,获得三门学科的综合得分,并用函数cbind()将综合得分添加到数据框roster中
#计算数据框z中每一行的均值,建立列向量score
五、利用函数quantile()可以得到综合得分score的分位数(是指将一个随机变量的概率分布范围分为几个等份的数值点,常用的有中位数——即二分位数、四分位数、百分位数等)
#按照0.2或20%作为分界点
六、通过逻辑运算符,将综合得分的分位数变量重新转换为包括五种成绩等级的变量,并且将该变量直接并入数据框roster
#大于等于前80%分数记为A等,并且赋值给数据框roster中的新变量grade(下同)。
#小于前80%、大于等于前60%分数记为B等
#小于前60%、大于等于前40%分数记为C等
#小于前40%、大于等于前20%分数记为D等
#小于前20%的分数记为E等
七、利用函数strsplit()以空格为拆分点把学生姓名拆分为两个向量——名(Firstname)和姓(Lastname),注意利用函数strsplit()拆分后得到的字符串向量将返回为一个列表(list)。
#默认为fixed=FALSE,即正则表达式匹配,因此建议需要用字符串拆分时务必设置fixed选项为TRUE,避免引起不必要的麻烦。
八、然而我们仅仅需要的是列表(list)中的向量,因此接下来马上要做的就是去列表化,将列表转化为名(Firstname)和姓(Lastname)两个向量。
利用函数sapply()可以分别提取列表中每个成分的第一个元素和第二个元素并储存,用同时应用是函数“[”,该函数可以提取某个对象的一部分——可以用来提取列表 name 各成分中的第一个或第二个元素。
至此,开头的难题被顺利解决。
天才符箓师,重生为七岁小女娃!稚嫩的外表,狠辣的手段。荒郊野外,她痛殴仇敌被太子撞见,她表情漠然,太子却一见倾心!“太子殿下不好了,太子妃大人一张定身符,把皇帝陛下定在大殿里吃土了。”“这不很正常么?谁让狗皇帝招惹我妻?定的好!再给他泼盆冰
《》所有内容均来自互联网或网友上传,本站基于搜索引擎爬虫技术对该小说进行检索,不保存、转储任何文章内容。只为原作者的小说进行宣传。欢迎各位书友支持梓云溪并收藏《》最新章节。