R基础
R的获取和安装
R可以在CRAN([Comprehensive R Archive Network,http://cran.r-project.org)上免费下载。
Linux、Mac OS X和Windows都有相应编译好的二进制版本。根据你所选择平台的安装说明进行安装即可。包(package)的可选模块(同样可从CRAN下载)来增强R的功能。
R语言介绍
- R是一种区分大小写的解释型语言。你可以在命令提示符(>)后每次输入并执行一条命令,
- 注释由符号#开头。在#之后出现的任何文本都会被R解释器忽略。
- R语句由函数和赋值构成。R使用<-,而不是传统的=作为赋值符号。
- "<<-"强制赋值给全局变量
- 符号都是英文输入法输入
- %>%是管道符的意思,把左边的输出(不包括 <-之前的)当成右边的输入。
Rstudio快捷键
- tab自动补齐
- ctrl+上 (查看历史)(mac:ctrl—command)
- esc (中断当前操作)
- alt + shift+k( 查看所有快捷操作)
- 快速注释:首先选中要注释掉的行,然后按Ctrl+shift+C ,这样就注释掉了。
- alt + - :<-
R的使用
![](https://img.haomeiwen.com/i27913461/c4057afdcc9dc300.png)
![](https://img.haomeiwen.com/i27913461/3e1e0b7732a62294.png)
-
注意setwd()命令的路径中使用了正斜杠。R将反斜杠(\)作为一个转义符。
-
list.file()/dir():显示当前工作目录内容
-
同时注意,函数setwd()不会自动创建一个不存在的目录。如果必要的话,可以使用函数dir.create()来创建新目录,然后使用setwd()将工作目录指向这个新目录。
-
当q()函数被运行的时候,程序将向用户询问是否保存工作空间。如果用户输入y,命令的历史记录保存到文件.Rhistory中,工作空间(包含向量x)保存到当前目录中的文件.RData(类似整个project,再打开可直接继续)中,会话结束,R程序退出。
-
输入脚本
函数source("script.R")可在当前会话中执行一个脚本。如果文件名中不包含路径,R将假设此脚本在当前工作目录中。举例来说,source("myscript.R")将执行包含在文件myscript.R中的R语句集合。 -
文本输出
函数sink("filename")将输出重定向到文件filename中。默认情况下,如果文件已经存在,则它的内容将被覆盖。使用参数append=TRUE可以将文本追加到文件后,而不是覆盖它。参数split=TRUE可将输出同时发送到屏幕和输出文件中。不加参数调用命令sink()将仅向屏幕返回输出结果。 -
图形输出
要重定向图形输出,使用表1-4中列出的函数即可。最后使用dev.off()将输出返回到终端。
用于保存图形输出的函数
Package
- 包是R函数、数据、预编译代码以一种定义完善的格式组成的集合。计算机上存储包的目录称为库(library)。函数.libPaths()能够显示库所在的位置, 函数library()则可以显示库中有哪些包。
- R自带了一系列默认包(包括base、datasets、utils、grDevices、graphics、stats以及methods),它们提供了种类繁多的默认函数和数据集。
- 其他包可通过下载来进行安装。安装好以后,它们必须被载入到会话中才能使用。命令search()可以告诉你哪些包已加载并可使用。
包的使用
install.packages()
install.packages("包名")
update.packages()更新已经安装的包。
installed.packages()查看已安装包。
要在R会话中使用它,还需要使用library()命令载入这个包
detach("package : pakckage_name"):从工作空间移除
remove.package("pakckage_name"):从硬盘上彻底删除
help(package="package_name"
可以输出某个包的简短描述以及包中的函数名称和数据集名称的列表。使用函数help()可以查看其中任意函数或数据集的更多细节。
- 克隆R包到另一设备
Rpack<- installed.packages()[,1]
save(Rpack,file = "Rpack.Rdata")
load("./Rpack.Rdata")
for ( i in Rpack ) install.packages(i)
![](https://img.haomeiwen.com/i27913461/fb63f3ac879dedc9.png)
创建数据集
- 数据集
数据集通常是由数据构成的一个矩形数组,行表示观测,列表示变量。
不同的行业对于数据集的行和列叫法不同。统计学家称它们为观测(observation)和变量(variable),数据库分析师则称其为记录(record)和字段(field),数据挖掘和机器学习学科的研究者则把它们叫作示例(example)和属性(attribute)。
本书中通篇使用术语观测和变量。
- R中有许多用于存储数据的结构,包括标量、向量、数组、数据框和列表。
- R可以处理的数据类型(模式)包括数值型、字符型、逻辑型(TRUE/FALSE)、复数型(虚数)和原生型(字节)。
数据结构
![](https://img.haomeiwen.com/i27913461/3fbddd19f5c50c53.png)
向量
向量是用于存储数值型、字符型或逻辑型数据的一维数组。执行组合功能的函数c()可用来创建向量.
矩阵
矩阵是一个二维数组,只是每个元素都拥有相同的模式(数值型、字符型或逻辑型)。可通过函数matrix()创建矩阵。
数组
数组(array)与矩阵类似,但是维度可以大于2。数组可通过array函数创建
数据框
由于不同的列可以包含不同模式(数值型、字符型等)的数据,数据框可通过函数data.frame()创建
列表
某个列表中可能是若干向量、矩阵、数据框,甚至其他列表的组合。可以使用函数list()创建列表:
变量
变量可归结为名义型、有序型或连续型变量。
- 名义型变量是没有顺序之分的类别变量。
- 有序型变量表示一种顺序关系,而非数量关系。
- 连续型变量可以呈现为某个范围内的任意值,并同时表示了顺序和数量。
类别(名义型)变量和有序类别(有序型)变量在R中称为因子(factor)。
##向量
a <- c(1, 2, 5, 3, 6, -2, 4)
b <- c("one", "two", "three")
c <- c(TRUE, TRUE, TRUE, FALSE, TRUE, FALSE)
##矩阵
mymatrix <- 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包含了可选的、以字符型向量表示的行名和列名。
#选项byrow则表明矩阵应当按行填充(byrow=TRUE)还是按列填充(byrow=FALSE),
#默认情况下按列填充。
#可以使用下标和方括号来选择矩阵中的行、列或元素。X[i,]指矩阵X中的第i行,X[,j]指第j列,X[i, j]指第i行第j 个元素。选择多行或多列时,下标i和j可为数值型向量
##数组
myarray <- array(vector, dimensions, dimnames)
# 其中vector包含了数组中的数据,dimensions是一个数值型向量,给出了各个维度下标的最大值,而dimnames是可选的、各维度名称标签的列表。
##数据框
mydata <- data.frame(col1, col2, col3,...)
#其中的列向量col1、col2、col3等可为任何类型(如字符型、数值型或逻辑型)
##列表
mylist <- list(name1=object1, name2=object2, ...)
#以通过在双重方括号中指明代表某个成分的数字或名称来访问列表中的元素。
函数factor()以一个整数向量的形式存储类别值,整数的取值范围是[1...k](其中k是名义型变量中唯一值的个数),同时一个由字符串(原始值)组成的内部向量将映射到这些整数上.
> patientID <- c(1, 2, 3, 4)
> age <- c(25, 34, 28, 52)
> diabetes <- c("Type1", "Type2", "Type1", "Type1")
> status <- c("Poor", "Improved", "Excellent", "Poor")
> diabetes <- factor(diabetes)
> status <- factor(status, order=TRUE)
> patientdata <- data.frame(patientID, age, diabetes, status)
> str(patientdata)
‘data.frame’: 4 obs. of 4 variables:
$ patientID: num 1 2 3 4
$ age : num 25 34 28 52
$ diabetes : Factor w/ 2 levels "Type1","Type2": 1 2 1 1
$ status : Ord.factor w/ 3 levels "Excellent"<"Improved"<..: 3 2 1 3
> summary(patientdata)
patientID age diabetes status
Min. :1.00 Min. :25.00 Type1:3 Excellent:1
1st Qu.:1.75 1st Qu.:27.25 Type2:1 Improved :1
Median :2.50 Median :31.00 Poor :2
Mean :2.50 Mean :34.75
3rd Qu.:3.25 3rd Qu.:38.50
Max. :4.00 Max. :52.00
数据输入
![](https://img.haomeiwen.com/i27913461/876c8cca63c5f5ae.png)
用键盘输入
- R中的函数edit()会自动调用一个允许手动输入数据的文本编辑器。具体步骤如下:
(1) 创建一个空数据框(或矩阵),其中变量名和变量的模式需与理想中的最终数据集一致;
(2) 针对这个数据对象调用文本编辑器,输入你的数据,并将结果保存回此数据对象中。
mydata <- data.frame(age=numeric(0),
gender=character(0), weight=numeric(0))
mydata <- edit(mydata)
#输入变量名和数据
#mydata <- edit(mydata)与fix(mydata)等价,能够编辑已经输入的数据并添加新的数据
read.table()函数被用于处理字符串并返回数据框
mydatatxt <- "
age gender weight
25 m 166
30 f 115
18 f 120
"
mydata <- read.table(header=TRUE, text=mydatatxt)
# mydata
age gender weight
1 25 m 166
2 30 f 115
3 18 f 120
从带分隔符的文本文件导入数据(.CSV)
mydataframe <- read.table(file, options)
# file是一个带分隔符的ASCII文本文件,options是控制如何处理数据的选项
![](https://img.haomeiwen.com/i27913461/2a0fd7e78c17afbe.png)
导入Excel 数据
xlsx包
……
-
处理对象的实用函数
![](https://img.haomeiwen.com/i27913461/82280761c531a3ba.png)
![](https://img.haomeiwen.com/i27913461/22c243f3d0e92c60.png)
![](https://img.haomeiwen.com/i27913461/607a0c0cf93fa251.png)
![](https://img.haomeiwen.com/i27913461/6de9f3ec571691b0.png)
![](https://img.haomeiwen.com/i27913461/322b90ba8284525e.png)
![](https://img.haomeiwen.com/i27913461/b9d4651ab565fe6f.png)
![](https://img.haomeiwen.com/i27913461/1d098b0fcab81fe6.png)
![](https://img.haomeiwen.com/i27913461/7fe415029dd2ca33.png)
![](https://img.haomeiwen.com/i27913461/3e881284974224d1.png)
![](https://img.haomeiwen.com/i27913461/52038f22222bd55e.png)
![](https://img.haomeiwen.com/i27913461/ea73feb78396df02.png)
![](https://img.haomeiwen.com/i27913461/bb0dfa79ffe3dae4.png)
图形
par(optionname=value, optionname=name,...)。
![](https://img.haomeiwen.com/i27913461/9076239cbcca01db.png)
![](https://img.haomeiwen.com/i27913461/4f5401d83a3f0acc.png)
![](https://img.haomeiwen.com/i27913461/30d09499449f89ff.png)
![](https://img.haomeiwen.com/i27913461/7794e95ca80c2948.png)
![](https://img.haomeiwen.com/i27913461/cbd06195f146b968.png)
![](https://img.haomeiwen.com/i27913461/a595716d0d0a9b57.png)
![](https://img.haomeiwen.com/i27913461/9e8f1ee72e3ef53e.png)
![](https://img.haomeiwen.com/i27913461/fbb887349eb71eed.png)
title(main="My Title", col.main="red",
sub="My Subtitle", col.sub="blue",
xlab="My X label", ylab="My Y label",
col.lab="green", cex.lab=0.75)
axis(side, at=, labels=, pos=, lty=, col=, las=, tck=, ...)
#为图形添加参考线
abline(h=yvalues, v=xvalues)
abline(v=seq(1, 10, 2), lty=2, col="blue")
#图例
legend(location, title, legend, ...)
#文本标注
text(location, "text to place", pos, ...)
mtext("text to place", side, line=n, ...)
#数学标注
help(plotmath)
#图形组合
#可以在par()函数中使用图形参数mfrow=c(nrows, ncols)来创建按行填充的、行数为nrows、列数为ncols的图形矩阵。另外,可以使用mfcol=c(nrows, ncols)按列填充矩阵。
par(mfrow=c(2,2))
数据处理
类型转换
![](https://img.haomeiwen.com/i27913461/c9d19aa0e2412f46.png)
数据排序
:order()
默认升序,在排序变量前加“-”,则降序。
数据集的合并
:merge()
横向合并(依赖共有变量如ID)(添加列/变量)
:rbind()
纵向合并(依赖共同变量,顺序不必相同(删除多余变量或者改为NA))(添加行,观测)
选取子集
选入、剔除 :变量名\第几个向量[条件]\
subset()
sample()
随机抽样 replace=False,无放回;replace=True 有放回
![](https://img.haomeiwen.com/i27913461/80b3681702e67217.png)
![](https://img.haomeiwen.com/i27913461/e8a7f4becef880bc.png)
![](https://img.haomeiwen.com/i27913461/3cdb785f28646645.png)
![](https://img.haomeiwen.com/i27913461/741b74f972620bdb.png)
通过函数set.seed()显式指定这个种子,让结果可以重现(reproducible)。
![](https://img.haomeiwen.com/i27913461/557d83227a337cc3.png)
![](https://img.haomeiwen.com/i27913461/003c62e4f4f08833.png)
- R中提供了一个apply()函数,可将一个任意函数“应用”到矩阵、数组、数据框的任何维度上。
apply(x, MARGIN, FUN, ...)
其中,x为数据对象,MARGIN是维度的下标,FUN是由你指定的函数,而...则包括了任何想传递给FUN的参数。在矩阵或数据框中,MARGIN=1表示行,MARGIN=2表示列。
sapply(x, FUN, options)
其中的x是你的数据框(或矩阵),FUN为一个任意的函数。如果指定了options,它们将被传递
给FUN。
控制流
![](https://img.haomeiwen.com/i27913461/e3c0302ecd4d8bf5.png)
- for结构
for循环重复地执行一个语句,直到某个变量的值不再包含在序列seq中为止。
for (var in seq) statement
- while结构
while循环重复地执行一个语句,直到条件不为真为止。
while (cond) statement
- 条件执行
if-else、ifelse、switch
switch(expr, ...)
其中的...表示与expr的各种可能输出值绑定的语句。
![](https://img.haomeiwen.com/i27913461/f65179a14247294c.png)
自编函数
![](https://img.haomeiwen.com/i27913461/5fcbe862cb95df9b.png)
在函数声明中为参数指定的值将作为其默认值。
函数cat()仅会在输入的日期格式类型不匹配"long"或"short"时执行。
![](https://img.haomeiwen.com/i27913461/9d2382a23b35aa58.png)
可以使用函数warning()来生成一条错误提示信息,用message()来生成一条诊断信息,或用stop()停止当前表达式的执行并提示错误
整合与重构
- 转置 t()
- 整合/折叠
aggregate(x, by, FUN)
用by=list(name1=groupvar1, name2=groupvar2, ... , nameN=groupvarN)这个赋值指定了一个更有帮助的列标签
aggregate()仅允许在每次调用中使用平均数、标准差这样的单返回值函数。
无法一次返回若干个统计量。要完成这项任务,可以使用by()函数。格式为:
by(data, INDICES, FUN)
其中data是一个数据框或矩阵,INDICES是一个因子或因子组成的列表,定义了分组,FUN是任
意函数
aggregate
reshape2 包
![](https://img.haomeiwen.com/i27913461/5a3b2e9126205554.png)
描述性统计分析
- summary():最小值、最大值、四分位数和数值型变量的均值,以及因子向量和逻辑型向量的频数统计。
- sapply(x, FUN, options):插入的典型函数有mean()、sd()、var()、min()、max()、median()、length()、range()和quantile()。
-
fivenum():可返回图基五数总括(Tukey’s five-number
summary,即最小值、下四分位数、中位数、上四分位数和最大值)。
e.g.
- Hmisc包中的describe()函数可返回变量和观测的数量、缺失值和唯一值的数目、平均值、
分位数,以及五个最大的值和五个最小的值。
pastecs包中有一个名为stat.desc()的函数,它可以计算种类繁多的描述性统计量。使用
格式为:
stat.desc(x, basic=TRUE, desc=TRUE, norm=FALSE, p=0.95)
其中的x是一个数据框或时间序列。若basic=TRUE(默认值),则计算其中所有值、空值、缺失值的数量,以及最小值、最大值、值域,还有总和。若desc=TRUE(同样也是默认值),则计算中位数、平均数、平均数的标准误、平均数置信度为95%的置信区间、方差、标准差以及变异系数。最后,若norm=TRUE(不是默认的),则返回正态分布统计量,包括偏度和峰度(以及它们的统计显著程度)和Shapiro-Wilk正态检验结果。这里使用了p值来计算平均数的置信区间(默认置信度为0.95)。
psych包也拥有一个名为describe()的函数, - 最后载入的程序包优先
分组计算描述性统计量
![](https://img.haomeiwen.com/i27913461/ef264a9258cf6e7e.png)
![](https://img.haomeiwen.com/i27913461/b5e0e88fcdac6ce7.png)
![](https://img.haomeiwen.com/i27913461/5d73b8203373e5d8.png)
![](https://img.haomeiwen.com/i27913461/a2f5e45579b4c2f4.png)
![](https://img.haomeiwen.com/i27913461/ae85f3e92d2d2b38.png)