找回密码
 立即注册
查看: 11541|回复: 20

《R语言实战》学习笔记分享(持续更新)

[复制链接]
发表于 2016-6-6 22:48:20 | 显示全部楼层 |阅读模式
感谢Robert  I.Kabacoff 著作了这本书,同时感谢高涛、肖楠、陈钢编译此书。最近在学习《R语言实战》,特将学习过程记录下来,供各位朋友参考,虽说是笔记,但是90%是书中内容,另外10%是自己偶尔冒出的一点点想法的记录和一些疑问,希望互相探讨。附件是读书笔记原始版及书中代码清单,供各位下载,还是提倡按照书中内容把代码一个个敲出来。第一章  R语言介绍
自定义启动环境以自动载入会频繁使用的包 ——P14
问: 如何自定义启动环境?
常见错误类型
  • 注意大小写
  • 注意引号与括号是否漏了;
  • 路径名称使用 “/” 或者 “\”;
  • 是否使用未载入包的函数

第二章  创建数据集
 按照个人要求的格式来创建含有研究信息的数据集是数据分析的第一步。这个任务包括以下两步:
  • 选择一种数据结构来存储数据
  • 将数据输入或导入到这个结构中
      本章的第一部分(2.1~2.2节)叙述了R中用于存储数据的多种结构。
      本章的第二部分(2.3节)涵盖了多种向R中导入数据的可行方法,通常,你只需要其中的一两种方法。
      本章的第三部分(2.4节)将讨论数据集的标注问题,并在2.5节介绍一些处理数据集的使用函数。

    2.1  数据集的概念
    由数据构成的矩形数组,行表示观测,列表示变量
      不同行业对于数据集的行列叫法不同,统计学家称之为 观测 (observation)和 变量 (variable),
    数据库分析师称之为 记录 (record)和 字段 (field),数据挖掘/机器学习学科的研究者则把他们叫
    示例(example)和属性(attribute)。

    2.2数据结构
      包括标量、向量、矩阵、数组、数据库和列表。

2.2.1  向量
用于存储数值型、字符型或逻辑型数据的一维数组。用函数c()可创建向量。
例如

     a <- c(2,1,5,6,4)

     b <- c(“北京”,”上海”,广州”,”深圳”)

     c <- c(TRUE,TRUE,FALSE,FALSE)
注意
标量是只含有一个元素的向量,例如f <- 2、g <- “中国”和h <- TRUE。它们用于保存常量。
  访问向量中的指定元素可用方括号表示,如:a[c(2,4)],用于访问a中的第二个和第四个元素,即1和6。
2.2.2  矩阵
  矩阵是一个二维数组,只是每个人元素都拥有相同的模式(数值型、字符型或逻辑型)用函数matrix来创建矩阵。
myymatrix <- matrix(vector,nrow=number_of_rows,ncol=number_of_columns,byrow=logical_value,dimnames=list(char_vector_rownames,char_vector_colnames))
  其中vector包含了矩阵的元素,nrow和ncol用于指定行和列的维数,dimnames包含了可选的,以字符型向量表示的行名和列名,选项byrows则表明矩阵应当按行填充(byrow=TRUE)还是按列填充(byrow=FALSE),默认是按列填充。
  提取矩阵中的元素时用[,],其中逗号前后分辨是,行数和列数。
如:
`x <- matrix(1:10,nrow=2)    #创建一个1到10、两行的矩阵。
x                             #查看矩阵内容。
x[2,]                         #查看x中,第二行的元素,即2  4  6  8 10。
x[,2]                         #查看x中,第二列的元素,即3 4。
x[1,4]                         #查看x中,第一行,第四列的元素,即7。
x[1,c(4,5)]                     #查看x中,第一行,第四、五列的元素,即7  9。`
2.2.3  数组
  与矩阵类似,但是维度可以大于2。可通过函数array来创建,形式如下:
myarry <- array(vector,dimensions,dimnames)
  其中vector包含了数组中的数据,dimensions是一个数值型向量,给出了各个维度下标的最大值,而dimnames是可选的、各维度名称标签的列表。
问:
  • 既然维度可以大于2,那么当维度为3、4的时候,是怎样的形式?
  • 下标是什么意思?
    2.2.4  数据框
      在R中最常处理的数据结构,不同列可以包含不同模式(数值型、字符型等)的数据,同一列的数据模式必须相同。可通过函数data.frame()来创建,如:
    mydata <- data.frame(col1,col2,col3,…)
      其中的列向量col1,col2,col3,…可为任意类型,(如数值型、字符型或逻辑型)每一列的名称可由函数names指定。
      使用$来提取数据狂中的特定元素,但是每次都输入数据框名,有点麻烦,用attach(),detach()和with()函数来简化代码。
    1. attach(),detach()和with()函数
      函数attach()可以将数据库添加到R的搜索路径中,函数detach()将数据框从搜索路径中移除,
    和with()函数
    当名称相同的对象不止一个时,attach()与detach()组合的方式,局限性就很明显。

    当环境中已经有一个此名称的对象时,原始对象取得优先权。
      使用with()的局限性在于,赋值仅在此函数的括号内生效,如果需要创建with()结构以外存在的对象,使用特殊赋值符<<- 替代标准赋值符(<-),它可以将对象保存到with()以外的全局环境中。
    2. 实例标识符
      在R中,可通过数据框操作函数中的rowname选项将对象指定为R中标记各类打印输出和图形中实例名称所用的变量。如:
    patientdata <- data.frame(patientID,age,diabetes,status,row.names=patientID)
    2.2.5  因子
    变量分为名义型、有序型或连续型变量。
  • 名义型变量是没有顺序的类别型变量。如病人患病类型(Type1、Type2)。
  • 有序型变量表示一种顺序,而非数量关系的变量。如病情(很差、较好、痊愈)。
  • 连续型变量可以呈现为某个范围内的任意值,并同时表示了顺序和数量。

    类别顺序关系数量关系
    名义型变量
    无序型变量
    连续型变量
      其中的名义型变量和有序型变量都是因子,因子很重要,因为它决定了数据的分析方式以及如何进行视觉呈现。
      函数factor()以一个整数向量的形式存储类别值,整数的取值范围是[1~k](其中k是名义型变量中唯一值得个数),同时一个由字符串(原始值)组成的内部向量将映射到这些整数上。要表示有序型变量需为函数factor()指定参数ordered()
      这里对向量的编码使用的是字母顺序,可以通过指定levels选项来覆盖默认排序。
    四分位数
    将n个数值从小到大排列,分别在20%,50%,75%的位置
    Q1的位置= (n+1) × 0.25
    Q2的位置= (n+1) × 0.5
    Q3的位置= (n+1) × 0.75
    2.2.6  列表
      是R中最为复杂的一张数据类型,是一些对象(或成分,component)的有序集合。用函数list()来创建。
    mylist <- list(obecjt1,obecjt2,…)
      其中的对象可以是目前为止讲到的任何结构。还可以为列表中的对象命名。
    mykist <- list(name1 = obecjt,name2 = obecjt2,…)
      两个原因让列表成为了R中的重要数据结构。
    1. 列表允许以一种简单的方式组织和重新调用不想干的信息
    2. 许多R函数的运行结果都是以列表的形式返回的

R语言中的不寻常特性
P30
  • 对象名称中的句点(.)没有特殊意义。但美元符号(x是指数据框A中的变量x。
  • R不提供多行注释或块注释功能,必须以#作为多行注释每行的开始。出于调试的目的,你也可以把想让解释器忽略的代码放到语句if(FALSE){……}中。将FALSE改为TRUE即允许这块代码执行。
  • 将一个指赋给某个向量、矩阵、数组或列表中一个不存在的元素时,R将自动扩展这个数据结构以容纳新值。如:
    x <- c(8,6,4)

    x[7] <- 10

    x

    [1] 8 6 4 NA NA NA 10
    通过赋值,向量x由三个元素扩展到了七个元素,
    x <- x[1:3]会重新将其缩减回三个元素。
  • R中没有标量,标量以氮元素向量的形式出现。
  • R中的下标不从0开始,而从1开始。在上述向量中,x[1]的值为8。
  • 变量无法被声明。它们在首次被赋值时生成。

    2.3 数据的输入2.3.1 使用键盘输入数据
      使用函数edit()会自动调用一个允许手动输入数据的文本编辑器。具体步骤如下:

  • 创建一个空数据框(或矩阵),其中变量名和变量的模式需与理想中的最终数据集一致;
  • 针对这个数据对象调用文本编辑器,输入你的数据,并将最终结果保存回此数据对象中。
    mydata <- edit(mydata) 可以等价于 fix(mydata)
    2.3.2  从带分隔符的文本文件中导入数据
      使用read.tabe()函数语法如下:
    mydataframe <- read.table(file,header=logical_value,sep="delimiter",row.names="name")
      其中,file是一个带分隔符的ASCII文本文件,header是一个表明首行是否包含了变量名的逻辑值(TRUE或FALSE),sep用来指定分隔数据的分隔符,row.names是一个可选参数,用以指定一个或多个表示行表示符的变量。

    符号表示方法ASCCI码概念/作用/意义
    空白符“ “32空白
    (水平)制表符“\t”94个或8个空白符
    换行符“\n”10将光标移至下一行
    回车符“\r”13让光标移至行首
    垂直制表符“\v”11垂直打出几个空格,打印机才能显示
      默认情况下,字符型变量将转换为因子,如果不想这样,有很多种方法可以禁止这种转换行为。其中包括设置选项stringsAsFactors = FSLSE,另一种方法是使用选项colClasses为每一列指定一个类,如logical(逻辑型)、numeric(数值型)、character(字符型)、factor(因子)。
    2.3.3 导入Excel数据
      可以将Excel文件导出为一个逗号分隔文件(csv),并使用前文额方式导入R中。
      在Windows系统中,可以用RODBC包来访问Excel文件。
      下载安装好RODBC包之后,可用read.xlsx/xls(file,n)来读取数据,其中file表示文件的路径,需用”file”表示,n表示要导入的工作表序号。
      书中使用了xlsx包,在下载此包之前,需做以下步骤:

    • 在JAVA官网下载JDK安装,并设置环境变量。(操作方式
    • 在R中下载rjava包,载入;
    • 在R中下载xlsxjars包,载入;
    • 在R中下载xlsx包,载入;
    • 使用书中范例进行操作。
    2.3.4  导入XML数据2.3.5  从网页抓取数据
    • 使用reanLines()下载网页
    • 使用grep()和gsub()一类的函数进行处理
      对于结构复杂的网页,使用RCurl包和XML包来提取想要的信息。在载入RCurl包之前需载入bitops包。
    2.3.6  导入SPSS数据
      用foreign包的函数read.spss(),也可用Hmisc包的函数spss.get(),后者是对前者的一个封装,可自动设置后者的许多参数,让转换结果更加简单一致。Hmisc包需载入。
    注意:在载入Hmisc包之前需要载入以下几个包。
  • lattice包

    install.packages("lattice")
    library(lattice)
  • survival包

    install.packages("survival")
    library(survival)
  • Formula包

    install.packages("Formula")
    library(Formula)
  • ggplot2包

    install.packages("ggplot2")
    library(ggplot2)
      然后就可以用spss.get()函数来导入数据了,如:

    mydataframe <- spss.get("mydata.sav),use.value.labels = TRUE)
      其中,mydata.sav是需要导入的spss文件,use.value.label = TRUE表示让函数将带有值标签的变量导入为R中水平对应相同的因子,mydataframe是导入后的R数据框。
    2.3.7  导入SAS数据
      使用foreign包的read.ssd()函数或者Hmisc包的sas.get()函数都可以,倘若使用的SAS是9.1或者更高版本,则这些函数无法正常使用。因为R尚未跟进SAS对文件结构的改动。可以使用以下两种方案:
    • 在SAS中使用PROC EXPORT将SAS数据集保存为一个逗号分隔的文本文件,并使用2.3.2节中叙述的方法将导出的文件读取到R中,如:
    SAS程序:

    proc exprot data = mydata

    outfile = "mydata.csv

    dbms = csv;

    run;

    R程序

    mydata <- read.table("mydata.csv",header = TRUE,sep = ",")
      另外,一款名为Stat/Transfer的商业软件(在2.3.12节介绍)可以完好地将SAS数据集(包括任何一支的变量格式)保存WieR数据框。
    2.3.8  导入Stata数据
      在R中使用类似代码:
    library(foreign)
    mydataframe <- read.dta("mydata.dta")
      其中,mydat.dta是Stata数据集,mydataframe是返回的R数据框。
    2.3.9  导入netCDF数据
      Unidata项目主导的开源软件库netCDF(network Common Data Form,网络通用数据格式)定义了一种机器无关的数据格式,可用于创建和分发面向数组的科学数据。netCDF格式通常用来存储地球物理数据。ncdf包和ncf4包为netCDF文件提供了高层的R接口。
    • 什么叫做机器无关?
    • 高层的R接口是什么意思?
    • 这两个包与普通的R包有什么区别?
      ncdf包为版本3或更早版本的netCDF库创建的数据文件提供了支持,在windows、Mac OS X和Liunx平台上均可使用。ncdf4包支持netCDF 4或更早的版本,在windows平台上不可用。
    使用以下代码:
    library(ncdf)

    nc <- nc_open("mybetCDFfile")

    myarray <- get.var.ncdf(nc,myvar)

      在本例中,对于包含netCDF文件mybetCDFfile中的变量myvar,其所有数据都被读取并保存到了一个名为myarray的R数组中。
      值得注意的是:ncdf和ncdf4包最近进行来了重大升级,使用方式可能与旧版本不同,另外这两个包中的函数名称也不同。请阅读在线文档以了解详情。

2.3.10  导入HDF5数据
  hdf全称是Hierarchical  Data Format,分层数据格式,用于管理超大型和结构几段复杂数据集的软件技术方案。在安装了HDF5库(1.2版或更高)之后,可以用hdf5包读取HDF5的数据。
2.3.11  访问数据库管理系统
  在R中,通过两种方式来获取关系型数据框管理系统(DSMS),一部分是通过原生的数据框驱动来提供访问功能,另一部分是通过ODBC或JDBC来实现访问的。
1. ODBC接口
  在R中使用ODBC包访问一个数据框,能连接到任意一种拥有ODBC驱动的数据库。步骤如下:
  • 针对你的系统和数据框类型安装和配置合适的ODBC驱动。
  • 在R中安装载入RODBC包。
    RODBC包中的函数
    函  数
    描  述
    odbcConnect(dsn,uid = “”,pwd = “”)建立一个到ODBC数据库的连接
    sqlSetch(channel,sqltable)读取ODBC数据库中的某个表到一个数据框中
    sqlQuery(channel,query)向ODBC数据库提交一个查询并返回结果
    sqlSave(channel,mydf,tablename = sqtable
    append = FALSE)
    将数据框写入或更新(append = TRUE)到ODBC
    数据库的某个表中
    sqlDrop(channel,sqtable)删除ODBC数据库中对的某个表
    close(channel)关闭连接
       RODBC包可以允许R和一个通过ODBC连接的SQL数据库之间进行双向通信。不仅可以读取数据还可以通过R修改数据库中的内容。
    library(RODBC)①

    myconn <- odbcConnect("mydsn",uid = "Rob",pwd = "aardvark")②

    crimedat <- sqlFetch(myconn,Crime)③

    pundat <- sqlQuery(myconn,"select * from Punishment")④

    close(myconn)⑤

    ① 载入RODBC包
    ② 通过一个已注册的数据源名称(mydsn)和用户名(rob)以及密码(aardvark)打开了一个ODBC数据库连接。
    ③ 连接字符串被传递给sqlFetch,它将Crime表赋值到R数据框crimedat中。
    ④ 对Punishment表执行了SQL语句select并将结果保存到pundat中。
    ⑤ 关闭连接。
    问:
    • 关闭连接是否是必须的?
    • 不关闭连接会怎样?
    2. DBI相关包
      DBI相关包为访问数据库提供了一个通用且一致的客户端接口。使用时请确保安装了针对你的系统和数据库的必要JDBC驱动。详细请参阅CRAN

    问:
    • 两个接口有什么区别?
    • 哪一种更便捷,或者更为普遍的使用?
    2.3.12  通过Stat/Transfer导入数据
      一款可在34种数据格式之间做转换的独立应用程序。此软件拥有Windows、Mac和Unix版本,支持前文叙述的各种统计软件的最新版本。也可以铜鼓ODBC访问如Oracle、Sybase、Informix和DB/2一类的数据库管理系统。

    2.4  数据集的标注
      为了是结果更易解读,通常会对数据集进行标注。通常这种标注包括为变量名添加描述性标签,以及为类别型变量中的编码添加值标签。
    2.4.1  变量标签
      将变量标签作为变量名,然后通过位置下标来访问这个变量。
      names(patientdata)[2] <- "Age at hostipalizantion (in years)"
      使用此串文中代码,再输入Age at hostipalizantion (in years)会报错,这是为什么?
    2.4.2  值标签
      函数factor()可为类别型变量创建值标签 。在上例中,假设又一个名为gender的变量,其中1表示男性,2表示女性。可以使用以下代码。
      patientdata$gender <- factor(patientdata$gender,levels = c(1,2),labels = c("male","female"))
      这里的levels代表变量的实际值,而labels表示包含了理想值标签的字符型向量。

    2.5  处理数据对象的实用函数
    函  数用  途
    length(object)显示对象中国元素/成分的数量
    dim(object)显示某个对象的维度
    str(object)显示对象的结构
    class(object)显示对象的类或类型
    mode(object)显示对象的模式
    names(object)显示对象中各成分的名称
    c(object,object,…)将对象合并入一个对象
    cbind(object,object,…)按列合并对象
    rbind(object,object…)按行合并对象
    Object输出某个对象
    head(object)列出对象的开始部分
    ltail(object)列出对象的最后部分
    ls()显示当前的对象列表
    rm(object,object,…)删除一个或更多个对象。语句rm(list = ls())
    将删除当前工作环境的几乎所有对象①
    newobject <- edit(object)编辑对象并另存为newobject
    fix(object)直接编辑对象
    注:① 以句点.开头的隐藏对象将不受影响。
    2.6  小结
[size=0em]

《R语言实战》第一二章节学习笔记及代码.zip

11.98 KB, 下载次数: 189

回复

使用道具 举报

发表于 2016-6-7 11:19:22 | 显示全部楼层
赞!楼主加油~
回复

使用道具 举报

发表于 2016-6-9 22:26:17 | 显示全部楼层
楼主好棒,我最近也开始用这本书学习R
回复

使用道具 举报

 楼主| 发表于 2016-7-3 19:25:54 | 显示全部楼层
本帖最后由 Rocky_Xin 于 2016-7-4 00:22 编辑

这个也是点击失误发的,正文在下面
回复

使用道具 举报

 楼主| 发表于 2016-7-3 19:26:29 | 显示全部楼层
本帖最后由 Rocky_Xin 于 2016-7-3 22:09 编辑

不小心多发了
回复

使用道具 举报

 楼主| 发表于 2016-7-3 19:26:45 | 显示全部楼层
本帖最后由 Rocky_Xin 于 2016-7-4 00:24 编辑

回头看,居然发了那么多次错误的,也不知道怎么删除,只能修改
回复

使用道具 举报

 楼主| 发表于 2016-7-3 19:27:25 | 显示全部楼层
  感谢Robert  I.Kabacoff 著作本书,同时感谢高涛、肖楠、陈钢编译此书。
  最近在学习《R语言实战》,特将学习过程记录下来,供各位朋友参考,虽说是笔记,但是90%是书中内容,另外10%是自己偶尔冒出的一点点想法的记录和一些疑问,希望互相探讨。末尾有本章的代码清单下载地址,与各位交流,还是提倡按照书中内容把代码一个个敲出来。
第三章  图形初阶
本章内容
图形的创建与保存

自定义符号、线条、颜色和坐标轴

标注文本和标题

控制图形维度

组合多个图形
3.1  使用图形
  在通常的交互式会话中,你可以通过逐条输入语句构建图形,逐渐完善图形特征,直至得到想要的结果。
  在通过代码保存图形时,将绘图语句夹在开启目标图形设备的语句和关闭目标图形设备的语句直接即可。
  通常绘制新图形时,会覆盖掉之前的图形,有三种方法能保证创建多个图形并随时查看每一个。
  • 第一种:在创建一个新图形之前,打开一个新的图形窗口:

    dev.new()

    statements to creat graph 1

    dev.new()

    statements to creat graph 2

    etc
      每一幅新图形将出现在最近一次打开的窗口中。
  • 第二种:通过图形用户界面查看多个图形。
      在windows上分为两步,在打开第一个图形窗口以后勾选历史(History)→记录(Recording),然后使用菜单中的上一个(Previous)和下一个(Next)来逐个查看已经绘制的图形。
  • 第三种:使用函数dev.new()、dev.next()、dev/prev()、dev.set()和dev.off()同时打开多个图形窗口,并选择将哪个输出发送到哪个窗口中,这种方法全平台适用。
    3.2  一个简单的例子
      在plot(x,y,type = “b”)中,type的类型有9种。分别绘制不同的图形。
    b

b

b
c

c

c
h

h

h
l

I

I
o

o

o
p

p

p
大S

大S

大S
小s

小s

小s
  其中o和b、大S和小s需要特别注意一下,仔细观察图形,注意他们的不同点。
3.3  图形参数
  第一种方法是使用par()函数,来指定图形的多个特征(字体、颜色、坐标轴、标题)。这种方法的特点是:除非秀给其中参数,否则将在会话结束前一直有效。
par(optionname = value,optionname = name,…)
  如果不加参数地执行par()将生成一个含有当前图形参数设置的列表。添加参数no.readonly = TRUE可以生成一个可以修改的当前图形参数列表。
  第二种方法是为高级绘图函数直接提供optionname = value的键值对。仅对当前图形有效。代码:
plot(dose,drugA,type = "b",lty = 2,pch = 17)
  并不是所有的高级绘图函数都允许指定全部可能的图形参数,需要参考函数的帮助来确定哪些参数可以通过这种方式设置。
3.3.1  符号和线条
  • pch : 指定绘制点时使用的符号。(书中P45)
  • cex : 指定符号的大小,cex是一个数值,表示绘图符号相对于默认大小的缩放倍数,默认大小为1。1.
  • lty : 指定线条类型。(书中P46)
  • lwd : 指定线条宽度。lwd是以默认值的相对大小来表示的(默认值为1)
      对于pch=21~25,还可以指定便捷颜色(col =  )和填充色(bg =  )
    3.3.2  颜色3.3.3  文本属性
    par(font.lab = 3, cex.lab = 2, font.main = 4, cex.main = 2)
      为何在文本属性的设置中,没有仅对当前图形设置生效的方法?
    3.3.4  图形尺寸与边界尺寸
  • pin  以英寸表示的图形尺寸
  • mai  以数值向量表示的边界大小,顺序为“下、左、上、右”,单位为英寸。
  • mar  以数值向量表示的边界大小,顺序为“下、左、上、右”,单位为英分。默认值为c(5,4,4,2)+0.1
    一英分等于十二分之一英寸。
      按照代码清单做一遍的同时,先自己理解每一句的含义,再看书中的解释。
    3.4  添加文本、自定义坐标轴和图例
      有些高级绘图函数允许自行设定坐标轴和文本标注选项。书中例子为图形添加了
    标题        main

    副标题      sub

    坐标轴标签  xlab、ylab

    坐标轴范围  xlim、ylim
      某些高级绘图函数已经包含了默认的标题和标签。可以通过plot()语句或单独的par()语句中添加ann=FLASE来移除他们。
    3.4.1  标题
      使用title()函数为图形添加标题和坐标轴标签。调用格式为:
    title(main = "main title", sub = "sub-title", xlab = "x-axis label", ylab = "y=axis label")
    3.4.2  坐标轴
      可以使用函数axis()来创建中自定义的坐标轴,而非使用R中的默认坐标轴。其格式为:
    axis(side, at = , labels = , pos = , lty = ,col = , las = , tck = , …)
      
      参数axes=FALSE将禁用高级绘图函数自动生成的坐标轴。包括坐标轴框架线。
      参数frame.plot=TRUE将恢复坐标轴框架线。
      参数xaxt=”n”和yaxt=”n”将分别禁用X轴和Y轴,会留下框架线,只是去除了刻度。
      在代码清单中,有一个round()函数,其主要作用是取两位小数。如round(1.235, digits = 2)返回的值为:1.24。其中digits可省略,直接写成round(1.235,2)。
    次要刻度线
      添加次要刻度线,需要使用Hmisc包中的mino.tick()函数,在载入Hmisc包之前,需载入lattice、survival、Formula、ggplot2包。
    minor.tick(nx = n, ny = n, tick.ratio = n)
      nx和ny分别指定了X轴和Y轴每两条主刻度线之间通过次要刻度线划分得到的区间个数。tick.ratio表示次要刻度线相对于主刻度线的大小比例。当前的主刻度线长度可使用par(“tck”)获取。
    3.4.3  参考线
    abline(h = yvalues, v = xvalues)
      为图形添加参考线。也可以指定其他图形参数(线条类型,颜色和宽度等等)
      注意:在输入书中两串代码时,得到的结果并不是,如图中所说的位置添加了参考线,反而在意料之外的位置,出现了两条线,这是为什么?复习时,需要重新检查。
    3.4.4  图例
      使用legend()函数来添加图例。格式如下:
    legend(location, title, legend, …)
    3.4.5  文本标注
      text()和mtext()函数。text()函数还可以标示图形中的点。我们只需要制定一系列x,y坐标作为位置参数,同时以向量的形式指定要放置的文本。x、y和文本标签向量的长度应当相同。
      数学标注
      使用类似于TeX中的写法为图形添加数学符号和公式。请参阅help(plotmatch)以获得更多的细节和示例。
    3.5  图形的组合
      可以在par()函数中使用图形参数mfrow=c(nrows, ncols)来创建按行填充的、行数为nrows、列数为ncols的图形矩阵。也可以使用mfcol=c(nrows,ncols)按列填充矩阵。
      代码清单3-4展示了图形布局的精细控制,我们可随自己的想法调整想要展示的图形。
    问:P61中的第二行代码,创建一个矩阵式什么意思?

[size=0em]

回复

使用道具 举报

 楼主| 发表于 2016-7-4 20:58:50 | 显示全部楼层
  感谢Robert  I.Kabacoff 著作本书,同时感谢高涛、肖楠、陈钢编译此书。
  最近在学习《R语言实战》,特将学习过程记录下来,供各位朋友参考,虽说是笔记,但是90%是书中内容,另外10%是自己偶尔冒出的一点点想法的记录和一些疑问,希望互相探讨。末尾有本章的代码清单下载地址,与各位交流,还是提倡按照书中内容把代码一个个敲出来。
第四章  基本数据管理


本章内容
操纵日期和缺失值

熟悉数据类型的转换

变量的创建和重编码

数据集的排序,合并与取子集

选入和丢弃变量

4.1  一个示例
  代码清单中,最后一行的最后一个参数,stringsAsFactors = FALSE,个人认为含义是:特征向量能否转换为因子,默认TRUE,可以转换。R中解释为:
stringsAsFactors
logical: should character vectors be converted to factors? The ‘factory-fresh’ default is TRUE, but this can be changed by setting options(stringsAsFactors = FALSE)



4.2  创建新变量
  在R中,算数运算符除了+、-、*、/,还有
^(或 **):求幂。

x%%y:求余,5%%2的结果为1。

x%/%y:整数除法,5%/%2的结果为2。
  代码清单4-2提供了三种将新变量整合到原始的数据框中的方式。相当于在列表中增加新的一列(新的观测)。作者推荐使用第三种方式,我个人也比较喜欢第三种,主要是简便并且不容易误操作。



4.3  变量的重编码
  重编码涉及根据一个变量和/或其他变量的现有值创建新值得过程。
运算符描述
<小于
<=小于或等于
>大于
>=大于或等于
= =严格等于①
! =不等于
! x非x
x | yx 或 y
x & yx 和 y
isTRUE( x )测试x是否为TRUE
P69页的第一句话是什么意思?
语句variable[condition] <- expression将仅在condition的值为TRUE时执行赋值。
解释:
variable 变量的

condition 条件

expression 表达式

仅在变量的条件为TRUE时进行赋值。
  首先要执行“将99转换为缺失值NA”,其次在书中P69页执行第一段或者第二段代码。
  函数within()与函数with()类似,不同的是它允许你修改数据框。



4.4变量的重命名
  • 交互式方法。
      使用fix(数据框名)即可调出一个交互式的编辑器,可直接点击变量名进行修改。
  • 编程的方法
      下载、载入reshape包,注意使用R 3.3.1版本。然后使用其中的rename()函数即可。
      编程的方式也分为几种方法:
  • 直接将旧名称换为新名称。

    data.frame <- rename(oldname = "newname", oldname = "newname", …)
  • 指定变换的变量数字。

    names(data.frame)[2] <- "newname"
  • 以向量的方式批量更换某一部分变量名。

    names(data.frame)[2:5] <- c("newname", "newname", …)



    4.5  缺失值
      is.na()将返回逻辑值TRUE(存在缺失值)和FALSE(不存在缺失值)。
    注意:

      缺失值被认为是不可比较的,即便是与确实值自身的比较。这一位这无法使用比较运算符来检测缺失值是否存在。例如,逻辑测试myvar == NA的结果永远不会是TRUE。作为替代,你只能使用处理缺失值的函数(如本节中所述的那些)来识别R数据对象终归的缺失值。
    4.5.1  重编码某些值为缺失值
      如4.3节那样可以使用赋值语句将某些值重编码为缺失值。
    leadership$age[leadership$age == 99] <- NA
      请确保所有的缺失数据已在分析之前被妥善地编码为缺失值,否则分析结果将失去意义。
    4.5.2  在分析中排出缺失值
      缺失值需要以某种方式删除,因为含有缺失值的算术表达式和函数的计算结果也是缺失值。
      多数数值函数拥有一个na.rm = TRUE的选项,可以在计算之前移除缺失值并使用剩余值进行计算。
    x <- c(1, 2, NA, 3)

    y <- sum(x, na.rm = TRUE)
      在使用函数处理不完整的数据时,请务必查阅他们的帮助文档,检查这些函数是如何处理缺失数据的。
      函数na.omit()可以移除所有含有缺失值的观测。
    4.6  日期值
      日期通常以字符串的方式输入到R中,然后转化为以数值形式存储的日期变量。函数as.Date()用于执行这种转化。其语法为:as.Date(x, “input_format“)
    符号含义示例
    %d数字表示的日期(0-31)01~31
    %a缩写的星期名Mon
    %A非缩写的星期名Monday
    %m月份(00-12)00~12
    %b缩写的月份Jan
    %B非缩写的月份January
    %y两位数的年份7
    %Y四位数的年份2007
      在P73页中有一句话,个人觉得,翻译有误。原文为:

    < 使用指定格式读取字符型变量,并将其作为一个日期变量替换到数据框中。
      个人建议将第二句话改为:并将其修改成指定格式的数值型变量(指定的日期格式)。
    时间戳
  • Sys.Date()函数  返回当天的日期。
  • date()函数    返回当前的日期和时间。
      使用函数format(x, format = “output_format”)来输出指定格式的日期值,并且可以提取日期值中的某些部分。
    疑问

      在使用如下代码时,书中显示的是英文的非缩写月份,而在RStudio中是中文的月份。
    today <- Sys.Date()

    format(today, format = "%B %d %Y")

      书中显示的是:”December 01 2010”
      而我操作时显示的是:”六月 29 2016”
    format(today, "%A")
      书中显示的是:”Wednesday”
      而我操作时显示的是:”星期三”
      difftime()函数用于计算时间间隔,并以星期、天、时、分、秒来表示。units = auto(自动)、secs(秒)、mins(分)、hours(时)、days(天)、weeks(星期)。
    问:为何没有年为结果的参数选项?
    4.6.1  将日期转换为字符型变量
    strDate <- as.character(dates)
    4.6.2  更进一步
      要了解字符型数据转换为日期的更多细节,请查看help(as.Date)和help(strftime)。
      要了解更多关于日期和时间格式的知识,请参考help(ISOdatetime)
      lubridate包中包含了许多简化日期处理的函数,可以用于识别和解析日期-时间数据,抽取日期-时间成分(例如年份、月份、日期等),以及对日期-时间值进行算术运算。
      如果你需要对日期进行复杂的计算,namefCalendar包可能会有帮助。它提供了大量的日期处理函数,可以同时处理多个时区,并且提供了历法操作功能,支持工作日、周末以及假期。



    4.7  类型转换
    判断转换类型
    is.numeric()as.numeric()数值型
    is.character()as.character()字符型
    is.vector()as.vector()向量
    is.martix()as.martix()矩阵
    is.data.frame()as.data.frame()数据框
    is.factor()as.factor()因子
    is.logical()as.logical()逻辑型
      名为is.datatype()这样的函数返回TRUE或FALSE,而as.datatype()这样的函数则将其参数转换为对应的类型。



    4.8  数据排序
      使用order()函数对一个数据框进行排序。默认的排序顺序是升序,在排序变量前边加一个减号,即可得到降序的排序结果。order()可以同时添加多个变量。
    4.9  数据集的合并
      如果数据分散在多个地方,你就需要在继续下一步之前将其合并。本节展示了向数据框中添加列(变量)和行(观测)的方法。
    4.9.1  添加列
      使用merge()函数可以,通过一个或多个共有变量合并数据框。
    如下代码
    ID <- c(1, 2, 3)
    name1 <- c("a", "b", "c")
    age1 <- c(11, 12, 13)
    name2 <- c("d", "e", "f")
    age2 <- c(14, 15, 16)
    dataframe1 <- data.frame(ID, name1, age1)
    dataframe1
    dataframe2 <- data.frame(ID, name2, age2)
    dataframe2
    newdataframe <- merge(dataframe1, dataframe2, by = "ID")
    newdataframe
      以上是通过一个共有变量ID,合并两个数据框的。
    newdataframe2 <- cbind(dataframe1, dataframe2)
    newdataframe2
      使用cbind()函数可以直接横向合并两个矩阵或数据框。
    4.9.2  添加行
      使用rbind()函数可以纵向合并两个数据框(数据集)。通常用于向数据框中添加观测。
    注意
  • 两个数据框必须拥有相同的变量,顺序可以不同。
  • 如果数据框A中有数据框B没有的变量,请在合并之前做以下某种处理:
    • 删除A中的多余变量。
    • 在B中创建追加的变量并将其值设为NA(缺失)。
    4.10  数据集取子集
      R拥有强大的索引特性,可以用于访问对象中的元素。也可利用这些特性对变量或观测进行选入和排除。
    4.10.1  选入(保留)变量
    myvars3 <- names(leadership) %in% c("q3", "q4")
    newdata4 <- leadership[!myvars3]
    newdata4
      (1) names(leadership)生成了一个包含所有变量名的字符型向量:c(“manafer”, “date”, “country”, “gender”, “age”, “q1”, “q2”, “q3”, “q4”, “q5”)。

      (2) names(leadership) %in% c(“q3”, “q4”)返回一个逻辑型向量,names(leadership)中每个匹配q3或q4的值为TRUE,反之为FALSE:c(FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, TRUE, TRUE, FALSE)。

      (3)运算符非(!)将逻辑值翻反转:c(TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, FALSE, FALSE, TRUE)。

      (4) leadership[c(TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, TRUE, FALSE, FALSE, TRUE)]选择了逻辑值为TRUE的列,于是q3和q4倍剔除了。
      在知道q3和q4是第八个和第九个变量的情况下,可以使用语句:
    newdata <- leadership[c(-8, -9)]
      将他们剔除。原理是:**在某一列的下标之前加一个减号(-)就会剔除那一列了。
      相同的变量删除工作亦可通过:
    leadership$q3 <- leadershi$q4 <- NULL来完成。
      将q3和q4设为了未定义(NULL)。注意,NULL和NA是不同的。
    4.10.3  选入观测
      选入或剔除观测(行)通常是成功的数据准备和数据分析的一个关键方面。
    代码清单4-6  选入观测
    newdata <- leadership[1:3, ]
    newdata
    newdata <- leadership[which(leadership$gender == "M" & leadership$age > 30), ]
    newdata



    attach(leadership)
    newdata <- leadership[which(gender == "M"& leadership$age > 30), ]
    detach(leadership)
    newdata
      在以上的每个示例中,你只提供了行下标,并将列下标留空(故选入了所有列)。在第一个示例中,你选择了第一行到第三行(前三个观测)。
      在第二个示例中,你选择了所有30岁以上的男性。让我们拆解这行代码以便理解它。
      (1) 逻辑比较leadership$gender == “M” 生成了向量c(TRUE, FALSE, FALSE, TRUE, FALSE)。
      (2) 逻辑比较leadership$age > 30 生成了向量c(TRUE, TRUE, FALSE, TRUE, TRUE)。
      (3) 逻辑比较c(TRUE, FALSE, FALSE, TRUE, FALSE) & c(TRUE, TRUE, FALSE, TRUE, TRUE)生成了向量c(TRUE, FALSE, FALSE, TRUE, FALSE)。
      (4) 函数which()给出了向量中值为TRUE元素的下标。因此,which(c(TRUE, FALSE, FALSE, TRUE, FALSE))生成了向量c(1, 4)。
      (5) leadership[c(1, 4), ]从数据框中选择了第一个和第四个观测。这就满足了我们选取准则(30岁以上的男性)。
      第三个示例使用了attach()函数,所以就不必再变量名前加上数据框名称了。
      将研究范围限定子啊2009年1月1日到2009年12月31日之间收集的观测,使用以下代码:

leadership$date <- as.Date(leadership$date, "%m/%d/%y")
startdate <- as.Date("2009-01-01")
enddate <- as.Date("2009-12-31")
newdate <- leadership[wihch(leadershi$date >= startdate & leadership$date <= enddate), ]
4.10.4  subset()函数
  使用subset()函数可以简便的选入观测。
  冒号运算符“:”,表示从…到…,在书中表示选择保留的列。
4.10.5  随机抽样
  sample()函数可以从数据集中(有放回或无放回地)抽取大小为n的一个随机样本。
  sample()函数中的第一个参数是一个由要从中抽样的元素组成的向量,在这里,这个向量是1到数据框中观测的梳理,第二个参数是要抽取的元素数量,第三个参数表示无放回抽样。sample()函数会返回随机抽样得到的元素,之后可用于选择数据框中的行。
  更进一步
  R中拥有齐全的抽样工具,包括抽取和小郑调查样本(详见sampling包)以及分析复杂调查数据(详见survey包)的工具其他依赖于抽样的方法,包括自助法和重抽样统计方法,详见第11章。
4.11  使用SQL语句操作数据框
由于不会SQL以及没有数据库相关经验,故跳过此章。
4.12  小结

[size=0em]

《R语言实战》第四章学习笔记及代码清单.zip

8.95 KB, 下载次数: 45

回复

使用道具 举报

 楼主| 发表于 2016-7-13 21:08:57 | 显示全部楼层
本帖最后由 Rocky_Xin 于 2016-7-13 21:12 编辑

  感谢Robert  I.Kabacoff 著作本书,同时感谢高涛、肖楠、陈钢编译此书。
  最近在学习《R语言实战》,特将学习过程记录下来,供各位朋友参考,虽说是笔记,但是90%是书中内容,另外10%是自己偶尔冒出的一点点想法的记录和一些疑问,希望互相探讨。末尾有本章的代码清单下载地址,与各位交流,还是提倡按照书中内容把代码一个个敲出来。
第五章  高级数据管理
本章内容
数学和统计函数
字符处理函数
循环和条件执行
自编函数
数据整合与重塑

5.1  一个数据处理难题
  一个难题:
  • 三科成绩是无法比较的。
  • 需要一种方法来确定某个学生在前述得分上百分比排名。
  • 表示姓名的字段只有一个,需要将姓和名拆开。

5.2  数值和字符处理函数
  本节将学习R中作为数据处理基石的函数,它们可分为数值(数学、统计、概率)函数和字符处理函数。

5.2.1  数学函数
  书中表5-2列出了常用的数学函数和简短的用例。(P83页)
  值得一提的是round(x, digits = n) 表示将x舍入为指定位的小数
  signif(x, digits = n)表示将x舍入为指定的有效数字位数
对比如下
round(3.475, digits = 2)返回值为3.48。(保留两位小数)

signif(3.475, n= = 2)返回值为3.5。(保留两位有效数字)
  表5-2中的示例将数学函数应用到了标量(单独的数值)上。当这些函数被应用于数值向量、矩阵或者数据框时,它们会作用于其中每一个独立的值,然后重新生成一个向量、矩阵或数据框。

5.2.2  统计函数
  方差:表示点的离散程度。方差越小,离散程度越低,越接近平均值。公式表达为:
S=[ (x1-x)^2+(x2-x)^2+(x3-x)^2+……+(xn-x)^2]
  标准差是方差开根号。
  什么是绝对中位差、分位数、值域、滞后差分、进化中心化、标准化?
代码清单5-1  均值和标准差的计算
x <- c(1, 2, 3, 4, 5, 6, 7, 8)
简洁的方式
mean(x)
sd(x)
冗长的方式
n <- length(x)
meanx <- sum(x)/n
css <- sum((x - meanx)^2)
sdx <- sqrt(css / (n-1))
meanx
sdx
  第二种方式中修正平方和(css)的计算过程是很有启发性的:
(1) x等于c(1, 2, 3, 4, 5, 6, 7, 8),x的平均值等于4.5(length(x)返回了x中元素的数量):
(2) (x - meanx)从x中的每个元素中减去了4.5,结果为c(-3.5, -2.5, -1.5, -0.5, 0.5, 1.5, 2.5, 3.5)
(3) (x - meanx)^2将(x - meanx)的每个元素求平方,结果为c(12.25, 6.25, 2.25, 0.25, 0.25, 2.25, 6.25, 12.25)
(4) summ((x - meanx)^2)对((x - meanx)^2)的所有元素求和,结果为42。
数据的标准化
  将一组数据,投射到很小区间内的方法,便于分析。标准化之后的数据有这样的特征:均值为0,标准差为1。
  函数scale()对矩阵或数据框的制定了进行均值为0,标准差为1的标准化。
newdata <- scale(mydata
  要对每一列进行任意均值和标准差的标准化,可以使用如下代码:
newdata <- scale(mydata) * SD + M
  其中SD表示想要的标准差,M表示想要的均值。注意,在非数值型的列上用scale()函数会报错。如果要对指定列而不是整个数据框或矩阵进行标准化,可以使用如下代码:
newdata <- transform(mydata, myvar = scale(myvar) * 10 + 50)
  此句将变量myvar标准化为均值50、标准差为10的变量。
问:是否有能将数据落到指定区间的方法?这种方法与书中的“指定均值和标准差”的方法有何异同?

5.2.3  概率函数
  概率函数通常用来生成特征已知的模拟数据,以及在用户编写的统计函数中计算概率值。在R中,概率函数形如:
[dpqr]distribution_abbreviation()
  其中第一个字母表示其所指分布的某一方面:
    d = 密度函数(density)
    p = 分布函数(distribution function)
    q = 分位数函数(quantile function)
    r = 生成随机数(随机偏差)
1. 设定随机数种子
  每次生成伪随机数的时候,函数都会使用一个不同的种子,可以通过函数set.seed()显式指定这个种子,让结果可以重现(reproducible)。代码清单5-2给出了一个示例,这里的函数runif()用来生成0到1区间上服从均匀分布的伪随机数。
  设置种子之后,如果种子是同一个数,那么每次产生的随机数,求和、均值、标准差都相同。这几个参数与种子数之间有什么关系?
注意:如果需要设定种子,那么在每一次生成随机数之前都要设定
2. 生成多元正态数据
  蒙特卡洛方法:也称统计模拟方法,是以概率统计理论为指导的一类非常重要的数值计算方法。是指使用随机数(或更常见的伪随机数)来解决很多计算问题的方法。与它对应的是确定性算法。蒙特卡洛方法百度百科解释
  MASS包可以让获取来自给定均值向量和协方差阵的多元正态分布的数据变得更容易。调用格式为:
mvrnorm(n, mean, sigma)
  其中n是你想要的样本大小,mean为均值向量,而sigma是方差-协方差矩阵(或相关矩阵)。

5.2.4  字符处理函数
  书中P89-P90页,表5-6 给出了字符处理函数表。
  请注意,函数grep()、sub()和strsplit()能够搜索某个文本字符串(fixed = TRUE)或者某个正则表达式(fixed = FALSE,默认值为FALSE)。正则表达式为文本模式的匹配提供了一套清晰而简练的语法。正则表达式 - 语法或者正则表达式语法.aspx)。
  例如^[hc]?at
  可以匹配任意0个或1个以h或c开头、后接at的字符串。因此,此表达式可以匹配hat、cat和at,但不会匹配bat。

5.2.5  其他实用函数
  转义符“\”,\n表示新行,\t为制表符,\’为单引号,\b为退格。

5.2.6  将函数应用于矩阵和数据框
  R函数的诸多有趣特性之一就是他们可以应用到一系列的数据对象上,包括向量、标量、矩阵、数组和数据框。
  R中提供了一个apply()函数,可将一个任意函数“应用”到矩阵、数组、数据框的任何维度上。其格式为:
apply(x, MARDIN, FUN, …)
  其中,x为数据对象,MARGIN是维度的下标,FUN是由你指定的函数,而…则包含了想传递给FUN的参数。在矩阵或数据框中,MARGIN=1表示行,MARGIN=2表示列。
mydata <- matrix(rnorm(30), nrow = 6)
mydata
apply(mydata, 1, mean)
apply(mydata, 2, mean)
apply(mydata, 2, mean, trim =0.2)
  最后一行表示计算每一列的截尾均值,忽略了最高和最低的20%
  apply()可把函数应用到数组的某个维度上,而lapply()和aspply()则可将函数应用到列表(list)上。

5.3  数据处理难题的一套解决方案
  针对5.1节提出的问题,本节给出了一个解决方案。
  • options(digits = 2)
  • Student <- c("John Davis", "Angela Williams", "Bullwinkle Moose", "David Jones", "Janice Markhammer", "Cheryl Cushing", "Reuven Ytzrhak", "Greg Knox", "Joel England","Mary Rayburn")
  • Math <- c(502, 600, 412, 358, 495, 512, 410, 625, 573, 522)
  • Science <- c(95, 99, 80, 82, 75, 85, 80, 95, 89, 86)
  • English <- c(25, 22, 18, 15, 20, 28, 15, 30, 37, 18)
  • roster <- data.frame(Student, Math, Science, English, stringsAsFactors = FALSE)
  • z <- scale(roster[ , 2:4])
  • score <- apply(z, 1, mean)
  • roster <- cbind(roster, score)
  • y <- quantile(score, c(0.8, 0.6, 0.4, 0.2))
  • y
  • roster$grade[score >= y[1]] <- "A"
  • roster$grade[score < y[1] & score >= y[2]] <- "B"
  • roster$grade[score < y[2] & score >= y[3]] <- "C"
  • roster$grade[score < y[3] & score >= y[4]] <- "D"
  • roster$grade[score < y[4]] <- "F"
  • name <- strsplit((roster$Student), " ")
  • name
  • lastname <- sapply(name, "[", 2)
  • firstname <- sapply(name, "[", 1)
  • roster <- cbind(firstname, lastname, roster[, -1])
  • roster <- roster[order(lastname, firstname),]
  • roster
      以下是解读过程:
  • 限定了输出小数点后数字的位数,并且让输出更容易阅读。
  • 输入学生姓名。
  • 输入数学成绩。
  • 输入科学成绩。
  • 输入英语成绩。
  • 创建一个数据框roster,其中的变量分别是:姓名、数学成绩、科学成绩、英语成绩。
  • 将数据框roster的第二到四列标准化,并保存到z中。标准化的原因是:由于数学、科学、和英语考试得到分值不同(均值和标准差相去甚远),在组合之前需要让他们变得可以比较。标准化就是让每科的成绩都用单位标准差来表示,而不是以原始的尺度来表示了。
  • 求z中所有行的均值,并保存到score中。
  • 将roster和score按列合成为一个矩阵,保存到roster中。
  • 分别求score的20%分位数,40%分位数,60%分位数,80%分位数。
  • 查看score的20%分位数,40%分位数,60%分位数,80%分位数。分别是
    80%60%40%20%
    0.910.32-0.36-0.88
  • 将大于等于80%,即大于等于0.91的成绩评为A。
  • 将60%(包含)至80%(不包含),即位于0.32(包含)和0.91(不包含)之间的成绩,评为B。
  • 将40%(包含)至60%(不包含),即位于-0.36(包含)和0.32(不包含)之间的成绩,评为C。
  • 将20%(包含)至40%(不包含),即位于-0.88(包含)和-0.36(不包含)之间的成绩,评为D。
  • 将小于20%,即小于-0.88的成绩评为F。
  • 使用strsplit()函数,将原数据框中的姓名,按照空格分成两列,并保存到新的列表name中。
  • 查看新列表name。
  • 选取列表中第二列,保存到一个新变量lastname中。
  • 选取列表中第一列,保存到一个新变量firstname中。
  • 将firstname和lastname添加到花名册roster中,并将原本第一个变量Student删除,(roster[, -1])。
  • 使用order()函数依照firstname和lastname对数据框进行排序。
  • 查看数据框roster。

    5.4  控制流
      为了理解贯穿本节的语法示例,请牢记以下概念:
    语句(statement)是一条单独的R语句或一组符合语句(包含在花括号{}中的一组R语句,使用分号分隔);
    条件(cond)是一条最终被解析为真(TRUE)或假(FALSE)得表达式;
    表达式(expr)是一条数值或字符串的求值语句;
    序列(seq)是一个数值或字符串序列。

    5.4.1  重复和循环
      循环结构重复地执行一个或一系列语句,知道某个条件不为真为止。循环结构包括for和while结构。
    1.  for结构
      for循环重复地执行一个语句,直到某个变量不包不再包含在序列seq中为止。语法为:
    for(var in seq) statement
      在下例中:
    for (i in 1:10) print ("Hello")
      单词Hello被输出了10次。
    2.  while结构
      while循环重复地执行一个语句,直到条件不为真为止。语法为“
    while (cond) statement
      第二个例子,代码:
    i <- 10

    while (i < 0) {pirnt ("Hello"); i <- i - 1}
      请确保括号内while的条件语句能够改变,即让它在某个时刻不再为真——否则循环将永不停止!

    5.4.2  条件执行
      在条件执行结构中,一条或一组语句仅在满足一个指定条件时执行。条件执行结构包括if-else、ifelse和switch。
    1.  if-else结构
      控制结构if-else在某个给定条件为真时执行语句。也可以同时在条件为假时执行另外的语句,语法为:
    if (cond) statement

    if (cond) statement1 else statement2
      示例如下:
    if (is.character(grade)) grede <- as.factor(grade)
      当grade为字符型向量时,将其转化为因子。
    if (!is.factor(grade)) grade <- as.factor else print ("Grade already is a factor")
      当grade不是因子时,将其转化为因子,当其是因子是,输出一段信息。
    2.  ifelse结构
      ifelse是if-else比较紧凑的向量化结构。语法为:
    ifelse (cond, statement1, statement2)
      当条件为真时,执行第一条语句,当条件为假时,执行第二条语句。
      示例如下:
    ifelse (score > 0.5, print("Passed"), print("Failed"))

    outcome <- ifels (score > 0.5, "Passed", "Failed")
    3.  switch结构
      switch根据一个表达式的值选择语句执行。语法如下:
    switch(expr, …)
      其中的…表示与expr的各种可能输出值绑定的语句。

    5.5  用户自编函数
      R最大的优点之一就是用户可以自行添加函数。R中许多函数都是由已有函数构成的。一个函数的结构看起来大致如此:
    myfunction <- function(arg1, arg2, …){

      statements

      return(object)

      }
      在第二个自编函数的示例中,函数cat()仅会在输入的日期格式类型不匹配“long”或“short”时执行。使用一个表达式来捕获错误输入的参数值通常是一个好主意
      有若干函数可以用来为函数添加错误捕获和纠正功能。warning()可以生成一条错误提示信息。message()可以生成一条诊断信息。stop()可以停止当前表达式的执行并提示错误。
    小提示
    一旦开始编写无论任何长度和复杂度的函数,优秀调试工具的重要性都会凸显出来。R中有许多实用的内建调试函数,也有许多用户贡献包提供了额外的功能。
    关于这个话题,一份优秀的参考资料是Duncan Murdoch整理的“Debugging in R”

    5.6  整合与重构
      在整合数据时,往往将多组观测替换为根据这些观测计算的描述性统计量。在重塑数据时,则会通过修改数据的结构(行和列)来决定数据的组织方式。

    5.6.1  转置
      转置(反转行和列)也许是重塑数据集的众多方法种最简单的一个了。使用函数t()即可对一个矩阵或者数据框进行转置。对于后者,行名将成为变量(列)名。

    5.6.2  整合数据
      在R中使用一个或多个by变量和一个预先定义好的函数来折叠(collapse)数据时比较容易得多。其调用格式为:
    aggregate(x, by, FUN)
      其中x是待折叠的数据对象,by是一个变量名组成的列表,这些变量将被去掉以形成新的观测,而FUN则是用来计算描述性统计量的标量函数,它将用来计算新观测中的值。
    5.6.3  reshape包
      首先将数据“融合”(melt),以使每一行都是一个唯一的标识符-变量组合。然后将数据“重铸”为你想要的任何形状。在重铸过程中你可以使用任何函数对数据进行整合。
    IDTimeX1X2
    1156
    1235
    2161
    2224
      在这个数据集中,测量(measurement)是指最后两列中的值(5、6、3、5、6、1、2、4)。每个测量都能够被标识符(在本例中,标识符是指ID、Time以及观测属于X1还是X2)唯一地确定。
    1.  融合
      使用以下代码:
    install.package("reshape")

    library(reshape)

    md <- melt(mydata, id = (c("id", "time")))
      融合后的数据集
    IDTime变量
    11X15
    12X13
    21X16
    22X12
    11X26
    12X25
    21X21
    22X24
    2.  重铸
      cast()函数读取已融合的数据,并使用你提供的公式和一个(可选的)用于整合数据的函数将其重塑。调用格式为:
    newdata <- cast(md, formula, FUN)
      其中的md为已融合的数据,formula描述了想要的最后结果,而FUN是(可选的)数据整合函数。其接受公式形如:
    rowvar1 + rowvar2 + … + ~ colvar1 + colvar2 + …
      在这一公式中,rowvar1 + rowvar2 + … 定义了要划掉的变量集合,以确定各行的内容,而colvar1 + colvar2 + … 则定义了要划掉的、确定各列内容的变量集合。

    作者注:本节(5.6.3)由于第一个示例代码就无法得到书中的结果,所以,本节学习笔记实际上只摘取了书中的内容,未理解其中的意义。主要是由于示例的表5-8 不知道何种形式的数据集,书中未给出,在尝试了矩阵、数据框、列表创建相同内容的数据集之后,均失败。
[size=0em]

《R语言实战》学习笔记及代码(第五章).zip

11.13 KB, 下载次数: 50

回复

使用道具 举报

发表于 2016-7-21 11:04:12 | 显示全部楼层
谢谢楼主,好人一生平安!
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|R语言中文网

GMT+8, 2024-11-24 21:56 , Processed in 0.041134 second(s), 20 queries .

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表