正在加载
请稍等

菜单

Home 码农菜园 数据分析 R学习笔记-4 基本数据管理
Home 码农菜园 数据分析 R学习笔记-4 基本数据管理

R学习笔记-4 基本数据管理

数据分析 by   阅读量 4,074

在实际情况中,60%以上的数据分析时间都花在了实际分析前的数据准备工作上,多数需要处理现实数据的分析师可能都面临着以某种形式存在的类似问题。

4.1 存在哪些问题?

  1. 一个数据集中可能含有几十个变量和成千上万的观测,但真正用于数据分析的可能只是其中的一部分;
  2. 原始数据可能需要经过计算汇总才能成为有效的分析依据,如求平均值等统计特征;
  3. 一个数据集中也许会有数百个变量,但是感兴趣的可能只有其中的一部分,需要根据需求进行合理筛选;
  4. 在必要的情况下,需要对某些值进行重编码,如将年龄值重编码为类别型的年龄组(例如年轻、中年、年长);
  5. 数据行为可能随时间推移而发生改变,因此选择恰当的研究时间范围起到重要的筛选作用。

4.2 创建新变量

在典型的研究项目中,你可能需要创建新变量或者对现有变量进行变换:

其中的“表达式”可以包含多种运算符和函数,以下为R中包括的算术运算符,算术运算符可用来构造公式。

  • +:加;
  • -:减;
  • *:乘;
  • /:除;
  • ^**:求幂;
  • x%%y:求余(x mod y);
  • x%/%y:整数除法,即向下取整。

以下给出三种方式,基于一个数据框中的变量生成新的变量并整合至数据框中。个人更倾向于第三种方式,即transform()函数的一个示例,这种方式简化了按需创建新变量并将其保存至数据框中的过程。

4.3 变量的重编码

重编码即根据同一个变量和/或其他变量的现有值创建新值的过程,也许你希望:

  • 将一个连续型变量修改为一组类别值;
  • 将误编码的值替换为正确值;
  • 基于一组分数线创建一个表示及格/不及格的变量。

要重编码数据,可以使用R中的一个或多个逻辑运算符。

  • <:小于;
  • <=:小于或等于;
  • >:大于;
  • >=:大于或等于;
  • ==:严格等于;
  • !=:不等于;
  • !x:非x;
  • x | y:x或y;
  • x & y:x和y;
  • isTRUE(x):判断x是否为TRUE。

例如将连续型年龄变量age重编码为类别型变量agecat,首先必须将99岁的年龄值重编码为缺失值(用99表示年龄数据缺失),使用的代码为:

语句variable[condition] <- expression仅在condition为TRUE时才执行赋值。

在处理完年龄缺失值后,即可使用以下代码将年龄值映射为年龄分类:

以上代码可以写成更紧凑的形式:

函数within()与函数with()类似,不同的是它允许修改数据框。需要注意的是,agecat现在仅仅只是一个字符型变量,更好的情况可能是把它转换成一个有序型因子。

若干程序包都提供了实用的变量重编码函数,如car包中的recode()函数可以十分简便地重编码数值型、字符型向量或因子,doBy包也提供了一个很受欢迎的函数recodevar()。最后,R中自带的cut()可以将一个数值型变量按值域切割为多个区间并返回一个因子。

4.4 变量的重命名

如果对现有的变量名称不满意,可以交互地或用编程的方式进行修改。例如,使用:

来调用一个交互式的编辑器,单击变量名即可在弹出的对话框中将其重命名。

若以变成方式,reshape包有一个rename()函数可用于修改变量名:

给出一个例子:

除此之外,还可以使用names()函数来重命名变量:

后者可用于多个同时重命名多个变量。

4.5 缺失值

在R中,缺失值以符号NA(Not Available)表示,不可能出现的值以符号NaN(Not a Number)表示。

R提供了一些函数,用于识别包含缺失值的观测。

将返回c(FALSE,FALSE,FALSE,TRUE)。

重编码某些值为缺失值

可以像之前演示的那样,将某些值重编码为缺失值。

一定要确保所有的缺失数据已在分析之前被妥善地编码为缺失值,否则分析结果将失去意义。

在分析中排除缺失值

确定了缺失值的位置以后,需要在进一步分析数据之前以某种方式删除缺失值,否则含有缺失值的算术表达式和函数的计算结果也是缺失值。好在多数的数值函数都拥有一个na.rm=TRUE选项,可以在计算之前移除缺失值并用剩余值进行计算。以下代码中,y等于6.

在使用函数处理不完整的数据时,务必查询它们的帮助文档以确定这些函数如何处理缺失数据。

可以通过函数na.omit()来移除含有缺失值的行:

删除所有含有缺失数据的观测(成为行删除)是处理不完整数据集的若干手段之一。但是当缺失值分布较多,或者一小部分变量中包含大量的缺失数据,行删除可能会剔除相当比例的数据,这是需要谨慎思考的。因此,在15章中还将探索更为复杂精妙的缺失值处理方法。

4.6 日期值

日期值通常以字符串的形式输入到R中,然后转化为以数值形式存储的日期变量,使用as.Date(x, “input_format”)执行此类转化。

日期格式化参数

日期值的默认输入格式为yyyy-mm-dd,以下代码将默认格式的字符型数据转换成了对应日期。

以下代码则按照定制的格式转换日期。

有两个函数对于处理时间戳数据特别实用。Sys.Date()可以返回当天的日期,而date()则返回当前的日期和时间。再介绍一个format()函数,用于定制格式输出日期:

R的内部在存储日期时,使用自1970年1月1日以来的天数表示,更早的日期则表示为负数,因此可以在日期上执行算数运算:

最后,可以使用difftime()来计算时间间隔,并以星期、天、时、分、秒来表示。

将日期转换为字符型变量

同样可以将日期变量转换为字符型变量,函数as.character()即可实现。进行转换后,即可使用一系列字符处理函数处理数据。

4.7 类型转换

R提供了一系列用于判断某个对象的数据类型和将其转换为另一种数据类型的函数。R与其他统计编程语言有着类似的数据类型转换方式,例如向一个数值型向量中添加一个字符串会将此向量中的所有元素转换成字符型。

类型判断和类型转换

is.datatype()函数使得可以针对不同的数据类型执行不同的处理,as.datatype()使得在分析之前可以将数据转换为要求的格式。

4.8 数据排序

有些情况下,查看排序后的数据集可以获得更多的信息。在R中,可以使用order()函数对一个数据框进行排序,默认升序,在排序变量前面加一个减号即可得到降序排序结果。

4.9 数据集的合并

如果数据分散在多个地方,则有必要进行数据合并,包括向数据框中添加列(变量)和行(观测)的方法。

添加列

要横向合并两个数据框,可以使用merge()函数,同时需要指定一个或多个共有变量进行联结(即一种内联结,inner join)。

如果要直接横向合并两个矩阵或数据框,并且不需要指定公共索引,则可以直接使用cbind()函数,此时每个对象必须拥有相同的行数并且以相同顺序排序。

添加行

要纵向合并两个数据框,则使用rbind()函数。纵向联结一般用于向数据框中添加观测记录。

两个数据框必须拥有相同的列,不过顺序不必一定相同。如果dataframeA中存在dataframeB中不存在的变量,那么合并之前必须完成以下某种处理:

  • 删除dataframeA中的多余列;
  • 在dataframeB中创建追加的变量并将其值设为NA。

4.10 数据集取子集

R拥有强大的索引特性,可以用于访问对象中的指定元素,也可以利用这些特性对行(观测)和列(变量)进行选入和排除。

选入(保留)变量

从一个大数据集中选择有限数量的变量来创建一个新的数据集是常有的事情。数据框中的元素是通过dataframe[row indices, column indices]来访问,下面的例子分别选入person的第6~10列,“name”、“age”和“gender”三列。

剔除(丢弃)变量

如果某个变量中有若干缺失值,那么可能在进一步分析之前就将其丢弃。以下代码丢弃了person的第4和第5列。

再来一个复杂一些的例子,其将“name”、“age”两列丢弃,其余列保留:

选入观测

通过建立条件来选择哪些观测符合要求。以下第一行代码选择了前三行观测,第二行代码选择了性别为“M”而且年龄大于30的观测。

subset()函数

使用subset函数也许是选择变量和观测最简单的方法。以下代码中,第一行最终选出来的是符合条件的“name”和“gender”两列,而第二行最终选出来的是符合条件的从“name”到“gender”的所有列(冒号表示from:to)。

随机抽样

 在数据挖掘和机器学习领域,从大数据集中抽样是很常见的做法,往往会选择两份随机样本,一份用于构建预测模型,另一份用于验证模型的有效性。sample()函数可以从数据集中有放回或者无放回地抽取大小为n的一个随机样本,第一个参数表示序号范围,第二个参数表示样本大小,replace=FALSE表示无放回。

4.11 使用SQL语句操作数据框

sqldf包允许使用SQL语句操作数据框,安装sqldf包后使用sqldf()函数即可执行SQL操作。

其中row.names=TRUE将原始数据框中的行名延续到新数据框中。

09 2015-04

发表评论