【R读书笔记】R语言读书心得4-初级数据管理(1)
在整个读书笔记的开端,我介绍了多种导入数据的方法,并给大家讲解了R语言的基本数据类型。而在新的一个部分,我们依然围绕数据本身进行讲解。和开始的第一部分有所不同的是,我在这里开了一个新的专题,数据管理。
数据管理,顾名思义就是对现有的数据进行管理。数据管理在整个数据分析的过程中也是非常重要的,如果我们没有把数据管理好,没有好好的检查我们现有的数据本身,将会给我们的结果的精度带来比较多负面的影响。
上一部分的内容中,我提到了我们导入的数据类型一般都会被转换为数据框。但是,这仅仅是我们整个数据分析当中一个很小部分。那么,我们在做数据分析 的时候,哪些步骤会比较花时间呢?其实,很多时候,我们往往会在数据的清洗和管理上花比较大量的时间,以此保证模型的精度。很多时候,当你有了一定的业务 背景以后,其实建模也不会花太多的时间。但是,数据内部的清洗和调整往往不是一簇而就的,甚至在分析过程中我们可能还要回过头来重新检查,这样,我们会发 现,我们花在数据清洗和管理的时间真的很多。所以,学好数据管理是非常重要的,它能给我们的模型带来良好的精度。
好了,既然之前我提到了我们一般处理导入过来的数据时,它们的一般格式就是数据框。所以,第一个实例也依然围绕数据框来展开。
假设有这样的5位领导层的人员,详细信息如下:
这时,我们可能会问这样的几个问题:
1.领导们所处的职位是否在性别上存在差异?
2.其它因素诸如国籍是否也影响一个人的职位?
这似乎看起来是一个有趣的问题。那么,看到这张表,可能我们立马想要研究的,就是领导人员的表现是否在某些因素上存在相关的差异?我们不妨看一看相关评判标准:
看到这个表格,我们很清晰的看见,它把评判标准分成5个等级,我们在后面的分析中,多少可能会设置一些相关的标准和区间来判别。
这时,我们不妨先把它转化为数据框的格式进行研究。
manager <- c(1, 2, 3, 4, 5)
date <- c("10/24/08", "10/28/08", "10/1/08", "10/12/08", "5/1/09")
country <- c("US", "US", "UK", "UK", "UK")
gender <- c("M", "F", "F", "M", "F")
age <- c(32, 45, 25, 39, 99)
q1 <- c(5, 3, 3, 3, 2)
q2 <- c(4, 5, 5, 3, 2)
q3 <- c(5, 2, 5, 4, 1)
q4 <- c(5, 5, 5, NA, 2)
q5 <- c(5, 5, 2, NA, 1)
leadership <- data.frame(manager, date, country, gender, age,
q1, q2, q3, q4, q5, stringsAsFactors=FALSE)
leadership
看到这个数据框,我们不难发现,q1-q5是评价一名经理表现的5项指标,分数为1-5。这时,你可能会思考,我们能否把q1-q5这5项指标综合 起来进行研究?而且,如果我们在实际生活中,这个数据集的数据量是远大于这个数据框的话,那么,我们是否要对此进行简化或者直接抽取一部分进行研究呢?还 有,q1-q5这5项指标实际上会随着时间的推移会产生动态的变化,这时,我们又如何处理呢?我们的心中还有很多很多的疑问,这些问题,在后面的分享中都 会涉及到。回到我们的数据框,我们看到第四位经历在q4、q5这两项指标里均为空值,同时还有第五位经理的年龄99,看起来也确实是一个异常值。这样,如 果直接就开始分析这个数据框,其实确实是有点牵强的。那么,我们不如先把这一个例子放一放,看一看我们在实际生活中是如何处理这些问题的?
2.1创建新的变量
有时,为了能更好的分析一个数据集,我们可能会对一个数据集的某些列进行汇总和整理,然后把它放到一个新的变量进行分析。这时,我们就需要对现有的数据集添加新的变量和数据以方便得出一个精确的结果。
好了,我们大家都知道创建一个新的变量的一般形式为:
Variable<-expression
在expression里,我们可能需要运用到各种运算,甚至要用到其它各种形式的变量。所以,我们不妨看一下在R里,我们常用到的运算符号都有哪些:
从图上,我们可以清楚看到的,加减乘除乘方、取模和整除都是我们平常算术中经常用到的运算符号。
下面,我就综合这里的运算符来创建一个数据框。
mydata<-data.frame(x=c(1,4,5,11),y=c(2,7,9,13))
mydata$sum<-mydata$x+mydata$y
mydata$mean<-(mydata$x+mydata$y)/2
mydata
上图的数据框,我们首先创了一个含变量x、y的数据框,然后再汇总x、y,把x、y的和和均值创建了,并把它放入数据框中,这样,我们即成功的把创建了一个含有8个数的数据框,同时还在此基础上创建了和和均值两个变量存入到原来的数据框,由此创建了一个新的数据框。
当然,下面的一些做法也能实现同样的效果。
mydata<-data.frame(x=c(1,4,5,11),y=c(2,7,9,13))
attach(mydata)
mydata$sumx <- x + y
mydata$meanx <- (x + y)/2
detach(mydata)
mydata<-data.frame(x=c(1,4,5,11),y=c(2,7,9,13))
mydata<-transform(mydata,sum=x+y,mean=(x+y)/2)
这两种方法都能实现第一种方法的效果。当然,第三种方法其实相对于前两种方法来说则更为简便,因此,我也提倡大家采用第三种方法来给数据框添加新的变量。
2.2变量重命名
如 果你觉得原始数据的命名不太符合你的口味,那么,R语言也提供了一些相关的函数你帮助你修改变量的名称。其实,早在上一部分的章节中,我们edit()一 个数据框时,就会弹出一个表格,第一行你可以根据需求自由修改变量名,关闭以后自动保存。所以,其实早在介绍数据框操作的时候就已经间接的说了一种可行的 修改变量名的方法。
其实,在R语言当中,还有其它一些方法也可以给变量进行重命名操作。
首先,我们要接触到的函数则是fix()函数。我们先查找一下fix()函数的帮助文档。
这里,我们看到,其实,fix()函数和edit()函数的功能是相似的,都是对原有的数据框进行一定的修改,并最终会保存最新的形式。下面,我们还是以之前的经理为例子,看一下fix()又是怎样运行的。
fix(leadership)
这里,和我们用edit()函数写出来的效果其实大同小异。所以,你可以直接查看我前面写的关于数据框的操作即可。
接下来,我们还可以采用reshape包里的rename函数来对这个数据框进行重命名。
由于reshape包并不是系统自带的,所以,我们需要另外安装。你可以选择点击系统的相关按钮进行安装,也可以install.packages(“reshape”)这样进行安装,当然,后面这种我建议在Rx3.2.3或者类似版本进行安装。
好了,安装完以后,我们不妨先调用一下reshape包:
library(reshape)
这样,我们已经成功调用reshape包了。
接下来,我们不妨也先看一下rename()函数的帮助文档:
这里,我们看到rename()也是一个操作简易的重命名函数。在函数里,我们只需要在rename()函数里写上一个变量,后面再写上要修改的新 的名字既可以达到修改变量名的目的。现在,我们不妨就立马试一下,还是引用之前的leadership数据框,看一看前后是否有什么变化:
library(reshape)
leadership <- rename(leadership,
c(manager="managerID", date="testDate")
)
leadership
这样,我们也达到了修改数据框变量名的目的。
当然,我们还有一种方法,也能达到修改变量名的效果。我们还可以使用names()函数来修改数据框的变量名。这时,我们需要用到数据框的索引操作了。这时,我们不妨试一下把gender改为ManagerGender,具体操作如下:
names(leadership)[4] <- "ManagerGender"
leadership
由于gender处在第四列,所以,我们在names()函数操作完以后,采用索引的方法,索引这个数据框的第四列,并把新的值传进数据框来,这样,我们同样也达到了修改变量名的效果。最后,我们用names()函数来看一下新的数据框里,我们改变了哪些变量的变量名:
names(leadership)
很明显,我们之前改动了manager、Date和gender这三个列的变量名。
2.3缺失值
在 导入数据并进行数据清洗的过程中,我们难免会遇到一些异常值和缺失值,尤其是缺失值,它或多或少的影响了数据分析的质量。但毕竟,当我们在进行一项大工程 的时候,由于各种原因,我们的数据出现了异常值和缺失值,而它就像我们当年在高中上物理课的时候,老师说的那样,误差只能不断地被减小,但不能完全地被消 除;在数据科学也是一样,当一个数据集达到一定规模的时候,除非是特理想情况下的数据集,否则,我们一定会看到缺失值和异常值。
在R语言进行数据分析的时候,我们也经常会遇到缺失值。下面,我们先看看这样的一个向量,并查看它包含什么类型的元素:
a<-c(1,2,3,4,5,NA,NA)
str(a)
这时,我们看到,尽管向量存在两个缺失值,但它依旧还是数字类型向量。
好了,接下来,我们使用is.na()函数来判断向量的空值:
is.na(a)
我们看到,它的返回结果是布尔类型;也就是说,它是一个一个进行比较的。这里,我们看到,后面两个元素为true,其余都为正,这就说明,我们刚刚看到a向量后面确实存在两个空值,而前面5个则是数字类型,因此,前面5个元素返回false值。
现在,我们又回到leadership数据框,同样使用is.na()函数来看一看它的q1-q5中是否存在空值:
b<-leadership[,(6:10)]
is.na(b)
我们之前看到的leadership数据集里,第四位经理的q4和q5得分均为空值,所以,在is.na中,这两个值返回了true,其余返回了false。
接下来,我简单的提一下异常值的问题。在高中的物理实验课上,老师通常都会告诉我们,如果我们在实验过程中遇到一些异常值,我们就需要把它们剔除;在数据科学也是一样,遇到异常值,我们也需要把它们剔除掉,以免降低数据分析的质量。
当 我们要计算一个含有异常值的数据集的平均数、方差、标准差或者是其它运算的时候,其结果往往会有极大的偏差。然而,如果一个数据集存在空值,一旦在R上这 么尝试运行,其系统返回的结果就会返回空值。所以,消除空值也是很有必要的。当然,要去除空值,我们不妨先把异常值设置为空值,然后和其它空值统一进行清 除处理。
回到leadership的数据框中,我们看到第五位经理的年龄是99岁。在我们日常生活中,我们基本上看不到有哪个人在99岁的时候还 在工作的。反正,在我的印象中,也就听过有这么样的一位奇人,一位妇产科医生,她在98岁的那一天还在坚持工作,她的坚持不懈也因此获得了感动中国的评 选,而她在上完班的最后一天便在睡梦中去世了。而且,世界各国都出台了相应的老年人退休的方案,即使是在老龄化比较严重的西方国家,他们基本都得在63, 最晚65的时候退休了。所以,对于年龄为99这样的一个值,我们也就理所当然的把它视为异常值来处理了。既然是这样,我们也自然而然的先对这个值进行赋空 值处理,相关代码如下:
leadership$age[leadership$age == 99] <- NA
再回到之前所列举的向量为例,要想使向量a能正常的进行一些运算,我们就必须要把里面的空值清除掉。这里,我们可以用na.rm这个参数进行清除空值处理。比如,当我们要计算向量a的元素之和时,我们就需要在sum()里添加na.rm=TRUE了,具体结果和代码如下:
sum(a,na.rm=TRUE)
除去空值以后能正常运算了,如果没有na.rm=TRUE,那么,我们计算出来的结果也必定是空值。计算leadership的q4、q5的均值显然是最好的实例了,其过程如下:
mean(leadership$q4)
既然说到这,我又得介绍这样的一个函数,它能直接把数据集里所有含有异常值的变量全部清除,从而达到了数据清洗的目的。这里,我们要介绍的这个函数就是na.omit()。这里,我们也查阅一下na.omit()的帮助文档:
这里,我们看到了几种空值的处理办法,而na.omit()则是返回一个经空值处理以后的一个数据框,而na.pass()在原有的基础上删除空值。其它的话自己好好体会一下,这里就不作讲解。
现在,我们不妨对leadership数据框进行空值处理:
na.omit(leadership)
这里,我们看到,由于第四第五行都存在空值,所以,它直接把第四第五行剔除掉,这样,我们就能研究前面三位经理的面试情况了。
严禁修改,可以转载,请注明出自数据人网和原文链接。
今日数据人网精选推荐:
点击【阅读原文】,即刻阅读精选!
数据人网是数据人学习、交流和分享的平台http://shujuren.org,专注于从数据中学习。
数据人网官方微信公众号:数据科学自媒体
请关注“恒诺新知”微信公众号,感谢“R语言“,”数据那些事儿“,”老俊俊的生信笔记“,”冷🈚️思“,“珞珈R”,“生信星球”的支持!