搜索
查看: 3858|回复: 1

[R] 《R语言实战》学习笔记(持续更新中)

[复制链接]

7

主题

8

帖子

70

积分

注册会员

Rank: 2

积分
70
发表于 2017-4-18 09:59:27 | 显示全部楼层 |阅读模式
http://note.youdao.com/noteshare ... 908fbfcbd4c549ba21d

第一章 R语言介绍
2017/03/15 14:54
  • R数据类型包括:向量,矩阵,数据框(类似数据集),列表(各种对象的集合);
  • 一次交互式会话期间的所有对象都被保存在内存中; 2017/03/15 21:30 难怪耗内存
  • c()函数可以将参数组成一个向量或列表。( 2017/03/15 21:30 列表是啥?哦哦,想起来了,向量中都是相同类型的元素,但列表中可以是不同类型的元素。 2017/04/12 19:36 c()函数很强大,可以组装向量和列表
  • q()退出R
  • 一个示例:

    • age <- c(1,2,3)
    • weight <- c(4,5,6)
    • mean(weight)
    • sd(weight)
    • cor(age,weight)
    • plot(age,weight)
  • help.start()打开R帮助首页 ( 2017/03/15 21:31 是个网页
  • getwd()查看当前工作目录
  • setwd()设定当前工作目录。目录名文件名加引号(注意这一点:目录名文件名要加引号)
  • ls()列出当前工作空间中的对象 2017/03/15 21:32 注意括号,不能像shell中直接ls,是ls()
  • rm(对象列表) ( 2017/04/12 19:46 rm(), ls()以及后面的history()都和Linux命令行很像。但是注意这里是函数,后面有括号
  • options()显示或设置当前选项 2017/03/15 21:32 下面有个例子:options(digits=3)
  • history(#)显示最近#个命令(默认25)
  • savehistory("file")保存命令历史到文件file中(默认值为.Rhistory)
  • loadhistory("file")载入命令历史文件(默认值为.Rhistory)
  • save.image("myfile")保存工作空间到文件myfile中(默认值为.RData)2017/03/15 21:33 注意不是仅仅保存图像,是整个工作空间(怎么起这么个名字?image有镜像的意思吗?)
  • save(objectlist,file="myfile")保存指定对象到文件myfile中 2017/03/15 21:34 和sink()等什么区别?不能指定文件格式?
  • load("myfile")读取一个工作空间到当前会话中,默认值为.RData。
  • 又一个示例:
    • options(digits=3)小数点后三位有效数字
    • x <- runif(20)创建一个包含20个均匀分布随机变量的向量
    • summary(x)统计摘要
    • hist(x)直方图
    • savehistory()保存命令历史到文件.Rhistory中
    • save.image()保存工作空间到.RData中
  • dir.create()创建新目录
  • load()不加选项,从上一次会话结束的地方重新开始
  • source("filename")在当前会话中执行一个脚本。脚本最好以R为扩展名;2017/03/15 21:36 shell中也可以用source执行脚本
  • sink("filename")将输出重定向到文件filename中,使用append=TRUE追加,split=TRUE将输出同时发送到屏幕和文件。sink()不加参数输出到屏幕; 2017/03/15 21:36 仅文本哦!
  • 图像输出:、
    • dev.off()将输出返回到终端( 2017/04/12 19:58 这个应该是因为前面执行了sink("filename"),所以这里用dev.off把重定向到文件关掉
    • pdf("filename.pdf")输出PDF文件
    • win.metafile("filename.wmf")windows图元文件
    • png("filename.png")PNG文件
    • jpeg("filename.jpg")JPEG文件
    • bmp("filename.bmp")BMP文件
    • postscript("filename.ps")postscropt文件
  • 示例:
    • sink("myoutput",append=TRUE,split=TRUE)先告知R:下面执行的脚本,文本输出定向到myoutput和屏幕上(split=TRUE)
    • pdf("mygraphs.pdf")先告知R:下面执行的脚本,图形输出定向到mygraphs.PDF文件
    • source("scripts.R")
  • 另一个示例:
    • sink()文本输出到屏幕
    • dev.off()输出返回到终端(使用这两行代码,是因为上面使用了sink和pdf,将文本和图片输出定向到了文件中;此处这两行代码是为了取消这种重定向。否则script3.R的输出结果仍将定向到myoutput文件和mygraphs.pdf文件中。)
    • source("script3.R")有了前面两行,重定向到文件的规定被取消,输出全都定向到标准输出。
  • 关于包的操作:
    • .libPaths()显示库所在的位置
    • library()显示有哪些包;
    • install.packages("包名称")安装包;不加参数显示CRAN镜像站点列表;
    • update.packages()更新包;
    • installed.packages()查看已安装的包;
    • library(包名称)载入包(注意没有引号) 2017/04/12 19:42 其他地方都有引号,唯有这里没有引号
    • search()那些包已加载;
    • help(package="package_name")以列表形式输出包的简短描述以及包中的函数名称和数据集名称
    • help(函数名或数据集名)承接上一步,获取上一步中显示的函数或数据集的名字;注意没有引号;
    • example(数据集名称)运行自带数据集自带的示例;
  • 批处理
    • Linux: R CMD BATCH options infile.R outfile.Rout;
    • windows: "R.exe" CMD BATCH --vanilla --slave "script.R"
  • 将输入作为输出——示例
    • lm(mpg~wt,data=mtcars)利用mtcars数据执行一次简单线性回归;
    • lmfit <- lm(mpg~wt,data=mtcars)回归结果复制给lmfit
    • summary(lmfit)显示分析结果概要
    • plot(lmfit)生成回归诊断图形
    • cook <- cooks.distance(lmfit)计算影响度量统计量;
    • plot(cook)对上面的结果绘图
    • predict(lmfit,mynewdata)对新的数据进行预测

第二章 创建数据集

2017/03/15 19:14
  • 数据集:由数据构成的矩形数组,行表示观测,列表示变量(观测-变量;记录-字段;示例-属性)
  • R中的数据结构:标量,向量,数组,数据框,列表;
  • R中的数据类型:数值,字符,逻辑,复数,原生(字节)
  • 实例标识符,日期数据,名义型和有序性变量;R将实例标识符称为rowname,将类别性变量称为因子。
2017/03/15 20:58
  • R中的数据结构包括标量,向量,矩阵,数组,数据框,列表;
  • 数据框:列表示变量,行表示观测,是用来存储数据集的主要数据结构;
  • 因子(factor)是名义型变量或有序型变量。
  • 矩阵和数据框的区别,可能在于矩阵中的数据都是同一种类型,而数据框中的数据各列可以是不同类型。
  • 向量:
    • 存储数值型,字符型,逻辑型数据的一位数组,可以用c()创建。单个向量中的数据必须是相同类型的;
    • 访问向量中元素的方法:
      • a[c(2,4)]
      • a[3]
      • a[c(1,3,5)]
      • a[2:6]
    • 冒号的用法:a <- c(2:6)等价于a <- c(2,3,4,5,6)
  • 矩阵:
    • 二维数组,元素拥有相同模式(数值型,字符型,逻辑型),用matrix创建。
    • mymatrix <- matrix(vector,nrow=number_of_row,ncol=number_of_columns,byrow=logical_value,dimnames=list(rownames,colnames)) 将一个向量(第一个参数vector)转换成矩阵,nrow指定行数,ncol指定列数,byrow TRUE或FALSE确定是按行排列还是按列排列(默认按列),dimnames指定行名和列名,行名和列名用向量表示。举例(Ctrl + L可以清屏):如下图所示:创建矩阵所用元素为向量cells中的元素。创建的是2x2的矩阵,按行排列元素。行名、列名已提前在向量rnmes和cnmes中规定好了,用的时候将两个向量变成一个list赋值给dimnames。( 2017/04/12 20:08 矩阵从向量来。指定行名列名要用列表
矩阵的创建



    • 矩阵中元素的引用:
      • x[2,]第二行
      • x[,2]第二列
      • x[1,4]第一行第四列的元素
      • x[1,c(4,5)]第一行,第四第五个元素
    • 维度超过2时,使用数组;有多种模式的数据时,使用数据框。
  • 2017/03/15 21:40 数组
    • 数组用array函数创建:myarray <- array(vector,dimensions, dimnames),其中第二个参数dimensions是维度,是一个数值型向量;第三个参数dimnames是各维的名字,是个列表。举个栗子:
列表的创建

注意dimnames是个关键词。维度用c()函数做成向量,各维名称用list做成列表。
  • 数组是矩阵的推广,其中的元素只能是一种模式。取元素方式与矩阵相同,如Z[1,2,5],第一个矩阵第二行第五列。
  • 数据框
    • 数据框可通过函数data.frame()创建:mydataframe <- data.frame(col1,col2,col3,...);每一列的名称可由names函数指定。再举个栗子:
数据框的创建

可以看到,数据框,就是把几个向量用data.frame()函数结合到了一起。注意产生的数据框已经自动加上了列名,列名即是结合的向量的名字。每一列只能有一种数据模式,但是不同列的数据模式可以不一样。

    • 数据框中元素的选择,可以用下标记号,也可以用列名,如patientdata[1:2],选了数据框第一列和第二列;而patientdata[1,2]选的是第一行第二列的元素;要选第一行第二行怎么办呢?那就是patientdata[1:2,]。注意没有逗号的时候默认是选择的列。( 2017/04/12 20:20 以后用的时候把逗号都加上吧。
    • 当然也可以使用列名来选取元素:patientdata[c("diabetes","status")]
    • 还有一种新的表示方法:patientdata$age,选取数据框patientdata中age这一列。
    • 上述描述的例子如下图所示:
从数据框中选取元素


    • 生成两个变量的列联表(注意这个列联表和统计中的列联表是一个意思,就是符合条件的个体数),可以这样写:table(patientdata$disbetes,patientdata$status),table()函数生成两个参数的列联表,得到符合两个条件交叉的个体数量。如下图所示:
从数据框中生成列联表

attach(),detach(),with()
  • attach()可将数据框添加到R的搜索路径中。R在遇到一个变量名后,将检查搜索路径中的数据框,以定位到这个变量。举个栗子:
    • summary(mtcars$mpg)
    • plot(mtcars$mpg,mtcars$disp)
    • plot(mtcars$mpg,mtcars$wt) 等价于下列代码:
    • attach(mtcars)
    • summary(mpg)
    • plot(mpg,disp)
    • plot(mpg,wt)
    • detach(mtcars) 注意用完后别忘再把变量从搜索路径中请出来,以免后面有麻烦。
  • 如果数据框中的变量与数据框外的变量同名,则attach(dataframe)会把数据框外的变量保留下来放在数据框中,即原有对象优先(而不是覆盖)。注意这一点,有点反逻辑。
  • 上面的栗子用with()函数改写如下:( 2017/04/12 20:27 模式:with(dataset,{statements})
    • with(mtcars,{
      • summary(mpg,disp,wt)
      • plot(mpg,disp)
      • plot(mpg,wt)
      • })大括号之间的语句都针对数据框mtcars执行。大括号内赋值的变量,仅在大括号内有效。如果要让大括号内赋值的变量在大括号外有效的话,需要使用<<-这个符号赋值。
指定实例标识符:
  • 在创建数据框时指定:patientdata <- data.frame(patientID,age,diabetes,status,row.names=patientID) 实例标识符(2017/04/12 20:28 这里的实例标识符相当于MySQL中的key吧?),看起来就类似于SQL中的键(注意,书上写错了,这里一定要是row.names。如果用其他的,不会报错,但是会创建一个新列列名就是等号左边的字符。如图所示)
在创建数据框时用"row.names=patientID"指定实例标识符。注意一定要是row.names。另外其他写法会增加一列。

因子:其实就是定类和定序类型的变量。
  • 函数factor()以一个整数向量的形式存储类别值,取值范围是[1-k],k是变量中唯一值的个数。
  • 举个栗子:
    • diabetes <- c("Type1","Type2","Type1","Type1")
    • diabetes <- factor(diabetes)将此向量存储为(1,2,1,1),并在内部关联1=Type1,2=Type2(注意了注意了!复制顺序是根据字母顺序定的!)
  • 有序变量的话,需要加ordered=TRUE选项。
  • 再举个栗子:
    • status <- c("Poor","Improved","Excellent","Poor")
    • status <- factor(status,ordered=TRUE)
    • 注意了注意了!!这里ordered=TURE只是告诉R,这个变量是个等级变量,但是没有规定等级的顺序!等级顺序是默认按字母顺序排列的。要想按照自己想要的顺序排列,需要使用levels选项:status <- factor(status,ordered=TRUE,levels=c("Poor","Improved","Excellent")) 在数据中出现而在这里levels中没有列举的元素,将全部被视为缺失值。
  • 举个大栗子:
因子的使用


    • 如图中所示,大部分内容都在前面提到过了。str(object)可提供R中某个对象的信息( 2017/04/12 21:13 注意这里的str是structure,不是string);信息显示diabetes是个factor,而status是个Ord.factor。在summary返回的信息中,不同类型的变量得到了不同的处理,这就是指定因子的意义所在。
列表:
  • 用list()创建列表:mylist <- list(object1,object2,...)
  • 还可以为列表中的每个对象取名字:mylist <- list(name1=object1,name2=object2,...)
  • 举个大栗子:
列表的创建与列表元素的获取


    • 如图中所示,列表的创建如上所说,没啥可再说的。列表元素的获取可以通过两种方式进行:一是索引号,二是题目。不管索引号还是题目都放在双方括号中( 2017/04/12 21:15 访问列表元素要用双方括号来索引,题目需要用双引号围起来。题目的使用不影响索引号,比如列表中的第二个元素,虽然加了ages这个题目,但是索引号依然是2。( 2017/04/12 21:16 再再再次说明R中的list很像python中的字典)
  • 一些注意事项:
    • R中没有多行注释,每行前面都要加#。但是可以用if(FALSE){...}这样的方式来使大括号内的语句不执行。
    • 如果赋值位置超过了索引号,变量将自动扩展以容纳新值。如下图所示:x只有3个元素,当要给x的第七个元素赋值时,R自动将x中元素数扩展到7,多出来的元素用NA补齐。注意R中元素索引是从1开始而不是从0开始
赋值范围超过了变量范围


    • R中没有标量,标量以单元素向量的形式出现;
  • 数据的输入:
    • 使用键盘输入数据:
      • 创建一个空的数据框:mydata <- data.frame(age=numeric(0),gender=character(0),weight=numeric(0))
      • 编辑数据:mydata <- edit(mydata) 出现如图所示的界面,即可编辑数据( 2017/04/12 21:19 注意先要创建一个空的数据框,然后再edit)。注意要赋值。edit()实际上是在副本上操作。
      • age=numeric(0)这个语句将创建一个指定模式但不含实际数据的变量
使用键盘输入数据



      • mydata <- edit(mydata)等价于fix(mydata) 注意使用fix()就不用赋值了。
    • 从带分隔符的文本文件导入数据
      • mydataframe <- read.table("file",header=logical_value,sep="delimiter",row.names="name")
      • file是ASCII文本文件,row.names用于指定表示行标识符的变量( 2017/04/12 21:21 就是行名)。注意row.names指定某一变量为记录的键。
      • 默认情况下,字符型变量将被转换为因子。设置选项stringsAsFactors=FALSE即可停止转换。另外可以使用colClasses为每一列指定一个类。
      • 函数file(), gzfile(), bzfile(), xzfile(), unz(), url()可作为文件名参数使用;用双引号围住的完整的URL也可以作为文件名参数使用。
    • 导入Excel数据
      • 另存为csv再用上面的方法导入;
      • 用RODBC包来访问Excel文件:
        • install.packages("RODBC")
        • library(RODBC)
        • channel <- odbcConnectExcel("myfile.xls") channel应该是个文件句柄。通过文件句柄访问。
        • mydataframe <- sqlFetch(channel,"mysheet") mysheet是文件中的一个工作表。从文件句柄中获取一个工作表,赋值给mydataframe
        • odbcClose(channel) 关闭文件句柄。
      • xlsx文件本质上是多个XML文件组成的压缩包。xlsx包可以用来读取这种类型的文件
        • library(xlsx)
        • workbook <- "c:/myworkbook.xlsx" 把字符串赋值给workbook
        • mydataframe <- read.xlsx(workbook,1) 打开c:/myworkbook.xlsx这个文件的第一个工作表,赋值给一个数据框。是的,read.xlsx()函数返回一个数据框。
    • 导入SPSS中的数据:
      • install.packages("Hmisc")
      • library(Hmisc)
      • mydataframe <- spss.get("mydata.sav",use.value.labels=TRUE) 其中use.value.labels=TRUE表示让函数将带有值标签的变量导入为R中水平对应相同的因子。
    • 访问数据库管理系统
      • 要使用R访问数据库,首先需要很对数据库类型安装和配置合适的ODBC驱动。
      • 安装RODBC包:install.packages("RODBC")
      • 举个栗子:
        • library(RODBC)
        • myconn <- odbcConnect("mydsn",uid="Rob",pwd="aardvark") 通过用户名密码登录数据框mydsn,并建立连接。
        • crimedat <- sqlFetch(myconn,Crime) 通过连接myconn访问mydsn数据库,获取Crime这个表,以数据框形式返回给crimedat。
        • pundat <- sqlQuery(myconn,"select * from Punishment") 使用查询语句对mydsn数据库进行查询,并以数据框形式返回给pundat
        • sqlSave(channel,tablename=sqtable,append=FALSE) 将数据框写入到ODBC数据库的某个表中。如果append=TRUE,则为更新。
        • sqlDrop(channel,sqtable) 删除ODBC数据框中的某个表
        • close(channel) 关闭连接
标注数据集:
  • 为变量名添加描述性标签
    • 将变量标签作为变量名,然后通过位置下标来访问这个变量。费这个劲呀...
    • names(patientdata)[2] <- "Age at hospitalization (in years)" 把names()应该是取一个数据库的变量名的意思,返回的应该是个向量。该赋值语句把其中第二个变量名改成了双引号中的内容。后面再需要引用这个变量时,就直接写patientdata[2]
  • 为类别型变量中的编码添加值标签
    • 举个栗子:名为gender的变量,1,2分别代表男,女,这时可以使用代码:
    • patientdata$gender <- factor(patientdata$gender,levels=c(1,2),labels=c("male","female")) 意思是,把数据框patientdata中的变量gender转换为因子,有两个水平,1和2;对应的标签分别是:male和female。
几个常用函数:
  • length(object)        显示对象中的元素/成分数量
  • dim(object)        显示对象维度
  • str(object)        显示对象结构
  • class(object)        显示对象的类或类型
  • mode()        显示对象的模式(这是什么意思?)
  • names()        显示对象中个成分名称(还可以修改名称,如上例所示)
  • cbind(object1,object2,...)        按列合并对象(把待合并对象一列一列排起来)
  • rbind(object1,object2,...)        按行合并对象(把待合并对象一行一行排起来)
  • head(object)        列出对象的开始部分
  • tail(object)        列出对象的最后部分
  • ls()        列出当前的对象列表
  • rm(list=ls())        除以点号开头的隐藏对象外,其他对象全部删除。

























上一篇:刘祖洞《遗传学》学习笔记(持续更新中)
下一篇:ggplot2 地图
回复

使用道具 举报

29

主题

131

帖子

1208

积分

金牌会员

Rank: 6Rank: 6

积分
1208
发表于 2017-4-18 17:27:08 | 显示全部楼层
这个笔记做的漂亮
回复 支持 反对

使用道具 举报

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

本版积分规则

QQ|手机版|小黑屋|生信技能树 ( 粤ICP备15016384号  

GMT+8, 2019-8-22 22:38 , Processed in 0.046241 second(s), 25 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.