第三天

从R对象中提取特定的值

运用[]

提取数据框中特定的值可以通过  对象名[,,,,。。。。。。]    完成,中括号内有两个参数,第一个表示行,第二个表示列,以此类推对于n维数组,就需要填n个参数。

在R中有六种索引编写方式

1、正整数索引

poker[i,j]

i,j 类似于线性代数里的坐标,准确标出索要提取元素的位置。i,j 既可以是单个正整数也可以是正整数向量。

提取的值并没有从数据框中删除,可以将提取的值赋给新的R对象。

R的记号体系可以提取任意R对象中的值。

如果只提取一列,R返回一个向量,否则R返回的是列表或者数据框。如果在只提取一列的情况下,仍想让R返回一个列表或数据框,可以添加参数drop=FALSE。

第三天_第1张图片
[c(1:3),c(1:3)]表示提取1到3行对应的1到3列

2、负整数索引

被负整数索引的元素不会出现在R返回的值中,可以用选取数据框中大部分的行和列,提高效率。

3、零索引

零索引不返回任何元素,所以没什么用。

4、空格索引

在[,]的一个参数位置键入空格,表示提取该维度(行或列或。。)的所有元素。

第三天_第2张图片

5、逻辑值索引

上头讲的提取都是按着元素的排列不中断的提取,如果我想隔一个或者随意隔几个元素提取呢?可以用逻辑值索引c(TRUE,TRUE,FALSE,FALSE......),T的地方表示提取,F的地方表示不提取,R会根据索引选择性的提取元素。这里要注意,索引向量的长度必须等于待提取元素向量的长度。

6、名称索引

如果被索引的对象有名称属性,可以根据名称进行索引,这在数据框中可以方便的提取列,因为数据框中的列一般都有名称。

运用$和[[ ]]

上述[ ]的提取方式简单易操作,但在提取列表和数据框的时候有一个特点,[],提取出来的是列表格式,就是依然带有结构,而$和[[ ]]提取出来的是不带结构的元素。这有什么区别呢?区别就在于$和[[ ]]提取出来的数据可以直接用函数进行计算例如sum、median、mean;而[]提取出来的数据一般为列表或者数据框无法直接用其他函数对提取出来的数据进行计算。

第三天_第3张图片
[[]]的用法和[]相同,$的用法是:对象$列名

由于$和[[]]提取的数据可直接进行运算,因此两者在列表和数据框数据的提取中作用非常大,使用频率非常高。

关于$和[[ ]]和[]的区别,下图给出了非常形象的描述

第三天_第4张图片

杜绝使用attach函数!

提取数据并更改

在知道元素位置的情况下,可以提取该元素,然后直接用赋值符号赋予新值。

poker2<-poker1,如上图,先提取value列,然后再提列在第13,26,39,62行的子集,并将该子集赋值。赋值向量的长度应当等于提取子集向量的长度或者满足R的循环规则

在不知道元素位置的情况下,就需要用逻辑值取子集的方法,在R中共有其中逻辑运算符

第三天_第5张图片

对向量进行逻辑运算,如果正确R返回值为TRUE,如果错误返回值为FALSE。

第三天_第6张图片
上图要注意两点:1、R中等于号是==,=不代表等号而是相当于赋值符号<-的作用,千万别搞错,不然很容易出乱 2、字符要加上引号,不然R会把字母当成对象

可以通过逻辑运算选定一个对象中符合条件的元素,然后对其进行提取和修改。


第三天_第7张图片

上述只是一个逻辑测试,比如说a

第三天_第8张图片


第三天_第9张图片
上图的最后一步检索,我有个问题为什么命令不能写成这样  poker2[,poker2$face=="queen" & poker2$suit=="spades" ]

缺失信息

当无法判断一个元素的取值是可以用NA(not available)表示,1+NA不等于1,因为NA的值无法判断。如果数据里有NA,计算后R返回的值也会是NA,所以大多数函数都有一个参数na.rm(NA remove),设置na.rm=TRUE以后,R会在对函数求值是忽略NA。如果要找出这些缺失的值,需要通过特定的函数找出NA,那就是is.na,R并不能识别NA,因为NA==NA,就是FALSE。

以上内容主要讲述了利用逻辑运算符和布尔运算符创建逻辑测试,然后将其作为索引值取子集的方法。

R的环境系统

可以想象一下一颗大树分出很多树枝,长出很多叶子,R的对象就相当于数值和叶子,整棵大树就是R环境。每一个对象都储存在环境(environment)当中,环境系统类似于计算机的文件系统,但是只支持自下而上的检索,不支持自上而下的检索。

可以在as.environment函数中输入环境名称(字符串),它将返回该名称对应的环境。在环境中有三个环境拥有自己的调用函数,分别是全局环境(R_GlobalEnv)、基环境(base)及空环境(R_EmptyEnv),它们的调用函数如下图:

第三天_第10张图片

可以用parent.env函数查看某一环境的父环境(类似于文件夹的上级文件夹),空环境没有父环境。可以用ls或ls.str命令查看存储在环境中的对象。Rstudio的右上方的环境面板可以显示全局环境中的对象。

可以用$提取环境中的对象

第三天_第11张图片

可以使用assign函数将对象储存到特定环境

第三天_第12张图片
上图,assign函数的参数中,第一个是新起的对象名,第二个是对象取值,第三个是存储的环境名称

通常来说活动环境(active environment)就是全局环境但是在函数运行的时候,活动环境可能会发生改变。可以使用environment函数查看当前的活动环境

全局环境在R中有十分重要的作用,命令行运行的命令都在全局环境中进行,命令行创建的对象也都保存在全局环境中,因此可以把全局环境当做用户工作区(user workplace)。

在检索对象时,R的检索遵循作用域规则(scoping rules),就是先检索所在的工作环境(命令行工作时,工作环境就是全局环境),如果检索不到就检索该环境的父环境,并以此类推,直到检索到或者到达顶层环境才终止。这里要注意一点:函数也是一种R对象,存储和检索R函数的方式与其它函数一致。

R是通过对象的名字来辨认对象的,如果存储在同一环境中的两个对象名字相同,那么后存储的对象就会取代之前存储的对象,那么之前存储的对象对应的元素也就消失了。

函数内部会往往定义和储存一些临时对象,函数在运行时,这些临时对象会被存储到活动环境中,为了避免这些临时对象覆盖之前在命令行定义的对象,R在每一次运行函数时都会创建一个新的活动环境(运行时环境),将这些临时对象保存在新的活动环境中。

R在每一次函数求值(evaluation)时都会创建一个新的环境即运行时环境(runtime environment),(因为该环境是R在运行函数时创建的所以叫运行时环境)并将运行结果返回到之前的环境(也就是调用函数时的环境)

show-env函数可以显示当前的活动环境、父环境和活动环境包含的对象。因为show-env本身就是函数,所以当其被调用时R也会创建一个运行时环境,那么它返回的活动环境也就是运行时环境。

第三天_第13张图片
第一次
第三天_第14张图片
第二次

上图可以看出,每次运行show_env,R都会创建不同的运行时环境。

一个函数的运行时环境所对应的父环境是该函数第一次创建时所在的环境,也成为原环境(origin environment),可以通过environment函数查看一个函数的原环境

运行时环境的父环境不一定是全局环境,这要取决于函数第一次创建时的环境。

你可能感兴趣的:(第三天)