正在加载
请稍等

菜单

Home 码农菜园 数据分析 R学习笔记-2 创建数据集
Home 码农菜园 数据分析 R学习笔记-2 创建数据集

R学习笔记-2 创建数据集

数据分析 by   阅读量 6,989

按照个人要求的格式来创建含有研究信息的数据集,这是任何数据分析的第一步。在R中,这个任务包括以下两步:

  1. 选择一种数据结构来存储数据;
  2. 将数据输入或导入到这个数据结构中。

2.1 数据结构

R拥有许多用于存储数据的对象类型,包括标量、向量、矩阵、数组、数据框和列表,其中一部分数据类型可以用下图来说明:

R中常见数据类型

向量

向量是用于存储数值型、字符型或逻辑型数据的一维数组,单个向量中的数据必须拥有相同的类型或模式。

用方括号访问向量中的元素,如访问向量a中的第二个和第四个元素:

支持冒号语法,以下将返回a的第二至第六个元素:

矩阵

矩阵是一个二维数组,每个元素都拥有相同的模式(数值型、字符型或逻辑型)。可通过函数matrix创建矩阵。

其中vector向量包含了矩阵元素,nrow和ncol为行数和列数,byrow默认为FALSE表示按列填充,否则TRUE为按行填充,dimnames为行列名。使用时,只有前三个参数是必须的。

x[i,]表示矩阵x中的第i行,x[,j]表示矩阵x中的第j列,x[i,j]表示矩阵x中的第i行第j个元素,或者使用数值型向量代替i、j以选择多行或多列。

数组

数组和矩阵类似,但是维度可以大于2,通过array函数创建。

其中vector包含数组中的数据,dimensions是一个数值型向量,给出了各个维度下标的最大值,dimnames可选、表示各维度名称标签的列表。

数据框

可以理解成数据库中的表,特点是不同的列可以包含不同模式(数值型、字符型等)数据,但是每列的数据模式必须相同,通过data.frame创建。

访问数据可以通过以下三种方式:

如果希望生成diabetes和status的列联表,使用以下代码即可:

可以使用attach()和detach()将数据框添加至R搜索路径或移除:

很好理解,添加到R搜索路径之后,就可以直接用列名访问数据框中的列了。考虑到命名冲突的问题,函数attach()和detach()最好在分析一个单独的数据框,并且不太可能有多个同名对象时使用。任何情况下,都要当心那些告知某个对象已被屏蔽(masked)的警告,意味着之后以这些名称命名的变量将被屏蔽。

除此之外,还可以使用with()函数:

由于大括号{}之间的语句都针对patientdata执行,所以不存在命名冲突的问题。主要注意的是,如果在大括号里面进行了变量赋值操作,在大括号外面讲无法访问该变量,除非是用特殊赋值符<<-。不妨试试以下代码,temp仅能在大括号内部访问,perm则可以在外部访问。

另外,可以使用row.names指定数据框的实例标识符(差不多就是主键的意思吧)。

因子

类别(名义型)变量和有序类别(有序型)变量在R中称为因子(factor)。因子在R中非常重要,因为它决定了数据的分析方式以及如何进行视觉呈现。

对于类别值,函数factor将其映射为整数:

其将Type1映射为1、Type2映射为2。

对于有序型,函数factor将其按字母顺序映射(需要增加参数ordered=TRUE表明当前处理的为有序型变量):

其将Excellent映射为1、Improved映射为2、Poor映射为3。

可以使用level来指定有序型的顺序:

其将Poor映射为1、Improved映射为2、Excellent映射为3。

列表

列表的每个元素可以是以上提及的任何数据类型,甚至其他列表的组合,使用list定义,可以为各个元素命名:

可以看到mylist包括四个元素,使用mylist[[2]]或者mylist[[“ages”]]访问第二个元素。

2.2 数据的输入

R可从键盘、文本文件、Microsoft Excel和Access、流行的统计软件、特殊格式的文件,以及多种关系型数据库中导入数据 。

R中数据的来源

使用键盘输入数据

可以使用键盘编辑变量的值:

  1. 创建一个空数据框(或矩阵),其中变量名和变量的模式需与理想中的最终数据集一致;
  2. 针对这个数据对象调用文本编辑器,输入你的数据,将结果保存回此数据对象中。

使用以下代码来手动编辑一个变量:

其中类似age=numeric(0)的赋值语句将创建一个指定模式但不包含实际数据的变量。注意,最后编辑的结果需要赋值回对象本身,否则所有修改将无法生效。

从带分隔符的文本文件导入数据

可以使用read.table()从带分隔符的文本文件中导入数据,该函数可读入一个表格格式的文件并将其保存为一个数据框:

file为一个带分隔符的ASCII文本文件,header表明首行是否包含变量名,sep表示分隔符,row.names可选,用以指定一个或多个表示行标识符的变量即主键,例如:

查看关于更多微调数据导入方式的追加选项,请参阅help(read.table)。

导入Excel数据

读取一个Excel文件的最好方式,就是在Excel中将其导出为CSV(逗号分隔文件)。

如有兴趣,在Windows上也可以研究如下包:RODBC和xlsx。

导入XML数据

R中有若干用于处理XML文件的包,例如由Duncan Temple Lang编写的XML包允许用户读取、写入和操作XML文件。XML格式本身已经超出了本书的范围,有兴趣的话可以参阅www.omegahat.org/RSXML,从中可以找到若干份优秀的软件包文档。

从网页抓取数据

主要是通过readLines()函数下载网页,然后使用如grep()和gsub()一类的函数处理。对于结构复杂的网页,可以使用RCurl包和XML包来提取其中想要的信息。更多信息和实例请参考Programming with R上的“Webscraping using readLines and RCurl”一文。

导入SPSS数据

SPSS数据集可以通过foreign包中的read.spss()或Hmisc包中的spss.get()函数:

use.value.labels=TRUE表示让该函数将带有值标签的变量导入为R中水平对应相同的因子。

导入SAS数据

SAS数据集可以使用foreign包中的read.ssd()和Hmisc包中的sas.get(),或者在SAS中首先将数据导出为CSV。

导入Stata数据

要将Stata数据导入R中非常直接简单:

访问数据库管理系统

R中有多种面向关系型数据库管理系统的接口,包括Microsoft SQL Server、Microsoft Access、MySQL、Oracle、PostgreSQL、DB2、Sybase、Teradata以、SQLite。

在R中通过RODBC包访问一个数据库也许是最流行的方式,这种方式允许R连接到任意一种拥有ODBC驱动的数据库。

第一步是针对你的系统和数据库类型安装和配置合适的ODBC驱动,第二步则是安装ODBC包,即install.packages(“RODBC”)。

RODBC包中的主要函数有:

  • odbcConnect(dsn,uid=””,pwd=””):建立一个到ODBC数据库的连接;
  • sqlFetch(channel,sqltable):读取ODBC数据库中的某个表到一个数据框中;
  • sqlQuery(channel,query):向ODBC数据库提交一个查询并返回结果;
  • sqlSave(channel,mydf,tablename=sqtable,append=FALSE):将数据框写入或更新(append=TRUE)到ODBC数据库的某个表中;
  • sqlDrop(channel,sqtable):删除某个表;
  • close(channel):关闭连接。

2.3 数据集的标注

为了使结果更易于解读,数据分析人员通常会对数据集进行标注。标注包括为变量名添加描述性的标签,以及为类别型变量中的编码添加值标签。

变量标签

例如,对于变量age,你可能想附加一个描述更详细的标签,“Age at hospitalization (in years)”,但是目前R对变量标签的支持能力十分有限。

值标签

函数factor()可以为类别型变量创建值标签:

2.4 处理数据对象的实用函数

  • length():显示对象中元素/成分的数量;
  • dim(object):显示对象的维度;
  • str(object):显示对象的结构;
  • class(object):显示对象的类或类型;
  • mode(object):显示对象的模式;
  • names(object):显示对象中各成分的名称;
  • c(object, object,…):将对象合并成向量;
  • cbind(object, object, …):按列合并对象;
  • rbind(object, object, …):按行合并对象;
  • Object:输出某个对象;
  • head(object):列出对象的前六个元素;
  • tail(object):列出对象的后六个元素;
  • ls():显示当前的对象列表;
  • rm(object, object, …):删除一个或多个对象,rm(list=ls())将删除当前工作空间中的几乎所有对象;
  • newobject <- edit(object):编辑对象并另存为newobject;
  • fix(object):直接编辑对象。

08 2015-04

发表评论