一:R语言之基本数据结构
1. 向量
向量是 R 语言中最基本的数据类型,在 R 中没有单独的标量(例如 1 本质上是 c(1)) 。
赋值
R 中可以用 = 或者 <- 来进行赋值 , <-的快捷键是 alt + - 。
> a <- c(2,5,8)
> a
[1] 2 5 8
筛选
R的下标是从1开始的,和python等不同(python四从0开始的)
> a[1]
[1] 2
> a[1:2]
[1] 2 5
当然我们也可以用逻辑进行筛选,例如
> a[a>4]
[1] 5 8
负数下标表示不选这个这些下标,例如:
> a[-2]
[1] 2 8
合并向量
c() 可以合并向量,例如
> c(a[1] , 3 , a[2:3] , 1)
[1] 2 3 5 8 1
循环补齐
向量有个比较有趣的性质,当两个向量进行操作时,如果长度不等, 长度比较短的一个会复制自己直到自己和长的一样长。
> a <- c(3,4)
> b <- c(1,2,5,6)
> a+b
[1] 4 6 8 10
a 自动变成了 c(3,4,3,4) 然后与b相加 , 得到了下面的结果。
遇到不懂得函数,可以用help("函数")查看函数用法。
help('which') ##查看which函数用法
2. 矩阵
矩阵,从本质上来说就是多维的向量,我们来看一看 我们如何新建一个矩阵。
> a <- matrix(c(1,2,3,4) , nrow = 2)
> a
[,1] [,2]
[1,] 1 3
[2,] 2 4
可以看到向量元素变为矩阵元素的方式是按列的,从第一列 到第二列,如果我们想按行输入元素,那么需要加入 byrow = TRUE 的参数:
> a <- matrix(c(1,2,3,4) , nrow = 2 , byrow = TRUE)
> a
[,1] [,2]
[1,] 1 2
[2,] 3 4
筛选矩阵
与向量相似,我们可以用下标来筛选矩阵, 例如:
a[行,列]
线性代数
当我们对两个矩阵相乘,我们得到的结果是 对应元素两两相乘的结果,例如:
而这不是我们想要的矩阵乘法,在 R 中我们在乘法旁边加两个 百分号来做矩阵乘法:
此外,我们可以用 t() 来求矩阵的转置 , 用 solve() 来求矩阵的逆。
3. 数据框
数据框类似矩阵,与矩阵不同的是,数据框可以有不同的数据类型。 一般做数据分析,我们把一个类似 excel 的表格读入 R ,默认的格式 就是数据框 , 可见数据框是一个非常重要的数据结构。
一般来说我们需要分析的数据,每一行代表一个样本,每一列代表一个 变量。
下面我们用 R 内置的数据集 iris 来看一看数据框的使用。
> data("iris")
> head(iris)
Sepal.Length Sepal.Width Petal.Length Petal.Width Species
1 5.1 3.5 1.4 0.2 setosa
2 4.9 3.0 1.4 0.2 setosa
3 4.7 3.2 1.3 0.2 setosa
4 4.6 3.1 1.5 0.2 setosa
5 5.0 3.6 1.4 0.2 setosa
6 5.4 3.9 1.7 0.4 setosa
我们用 data 函数调入了 iris 这个数据集 , 然后用 head 函数来看一看这个数据 的前几行 , 可以看到有 sepal 的长度,宽度,petal 的长度和宽度,还有一个变量 Species 来描述样本的类别。
我们可以用 summary 函数来对数据集做大致的了解。
> summary(iris)
Sepal.Length Sepal.Width Petal.Length Petal.Width Species
Min. :4.300 Min. :2.000 Min. :1.000 Min. :0.100 setosa :50
1st Qu.:5.100 1st Qu.:2.800 1st Qu.:1.600 1st Qu.:0.300 versicolor:50
Median :5.800 Median :3.000 Median :4.350 Median :1.300 virginica :50
Mean :5.843 Mean :3.057 Mean :3.758 Mean :1.199
3rd Qu.:6.400 3rd Qu.:3.300 3rd Qu.:5.100 3rd Qu.:1.800
Max. :7.900 Max. :4.400 Max. :6.900 Max. :2.500
可以直观地看到每个变量的信息,对于几个数值变量,我们可以看到最小值,中位数等等统计信息。而对于 Species 这个分类变量,我们看到的是计数信息。
筛选数据框与矩阵相似,都可以通过数字下标来获取子集,不同地是因为数据框有不同的列名,我们也可以通过列名来获取某一特定列,例如:
> iris$Species
[1] setosa setosa setosa setosa setosa setosa setosa setosa setosa setosa setosa setosa setosa setosa setosa setosa setosa setosa ...
我们可以用 names() 函数来获取数据框的列名
> names(iris)
[1] "Sepal.Length" "Sepal.Width" "Petal.Length" "Petal.Width" "Species"
并可以通过为其赋值改变列的名字。
4:列表
列表是一种递归式的向量,我们可以用列表来存储不同类型的数据,比如:
> l <- list(name="jiawen" , pigu_num=2 , is_handsome = TRUE)
> l
$name
[1] "jiawen"
$pigu_num
[1] 2
$is_handsome
[1] TRUE
列表有多种索引方式,可以用如下方式获取。
> l$name
[1] "jiawen"
> l[[2]]
[1] 2
> l[["is_handsome"]]
[1] TRUE
几个学习R的网站
DataCamp: https://www.datacamp.com/
统计之都: http://cos.name/
肖凯博客(翻墙): http://xccds1977.blogspot.com/
几个学习R的书籍
- R for data science : 由 Hadley Wickham 合作编写的 2017 年出版的书籍 ,主要介绍的 tidyverse 生态 , tidyverse 中包括了 dplyr(用于数据处理) , ggplot(用于画图)等包,大幅增强了 R 语言的表现力 , 有免费的在线版本
- R 语言实战 : 一本从统计角度介绍 R 语言的书籍 ,较为简单 , 适合快速翻阅。
- An Introduction to Statistical Learning : 斯坦福统计系几位教授出版的统计学习书籍,对统计学习进行了清晰细致的讲解 , 书有开源版本 ,并且在Stanford Lagunita上有配套课程
- The Art of R Programming : 介绍 R 语言的编程 , 在数据结构 ,面向对象 ,性能等等话题上不乏深入的见解和精妙的案例。
- Advanced R : Hadley Wickham编写关于 R 语言高级编程的书籍 , 同样有免费的在线版本。
5. Tidyverse生态链
今天我们实验的对象就是一组从原始 R 进化出来的工具链 Tidyverse , 它是由 Hadley Wickham 主导开发的一系列 R 包的集合。 Tidyverse 继承了R语言进行快速统计分析的优势 , 并实现了一些新的理念 , 例如 magrittr 包中的管道操作 , 让线性嵌套的函数组合变得更加清晰易懂;可视化方面中的 ggplot ,使绘图变成搭积木式的图层叠加。
这样的小发明有的改变了分析的运作方式 , 有的改变了使用者的认知方式 , 聚在一起形成了一种新的数据分析的生态链 。具体来看 , Tidyverse 有如下核心组件:
- readr : 读取数据
- tidyr : 整理数据
- dplyr : 数据转换
- ggplot : 可视化
- purrr : 函数式编程
一个实例:
1. 首先载入 tidyverse 包 , 并观察 mpg 数据的头部:
library(tidyverse)
mpg
## # A tibble: 234 × 11
## manufacturer model displ year cyl trans drv cty hwy
## <chr> <chr> <dbl> <int> <int> <chr> <chr> <int> <int>
## 1 audi a4 1.8 1999 4 auto(l5) f 18 29
## 2 audi a4 1.8 1999 4 manual(m5) f 21 29
## 3 audi a4 2.0 2008 4 manual(m6) f 20 31
## 4 audi a4 2.0 2008 4 auto(av) f 21 30
## 5 audi a4 2.8 1999 6 auto(l5) f 16 26
## 6 audi a4 2.8 1999 6 manual(m5) f 18 26
## 7 audi a4 3.1 2008 6 auto(av) f 18 27
## 8 audi a4 quattro 1.8 1999 4 manual(m5) 4 18 26
## 9 audi a4 quattro 1.8 1999 4 auto(l5) 4 16 25
## 10 audi a4 quattro 2.0 2008 4 manual(m6) 4 20 28
## # ... with 224 more rows, and 2 more variables: fl <chr>, class <chr>
mpg 数据集是刻画不同汽车的排放状况的一个数据集, 总过有 234 个样本 , 11 个变量 。 这 11 个变量分别是:
manufacture: 制造商
model: 车型
dispel: 汽车排放量
year: 制造年度
cyl: 排气管数量
trans: 排放类型
drv: 驱动方式
cty: 每公里耗油量(城市道路)
hwy: 每公里耗油量(高速路)
fl: 油的种类
class: 车的类型
更多数据相关信息可以通过 help(mpg) 指令获取。
2.ggplot
基本语法
数据(data):将要展示的数据;
映射(mapping):数据中的变量到图形成分的映射;
几何对象(geom):用来展示数据的几何对象,如geom_point,geom_bar,geom_abline;
图形属性(aes):图形属性决定了图形的外观,如字体大小、标签位置及刻度线;
标度(scale):决定了变量如何被映射到图形属性上;
坐标(coordinate):数据如何被映射到图中。如coord_cartesian:笛卡尔坐标、coord_polar:极坐标、coord_map:地理投影;
统计变换(stat):对数据进行汇总,如箱线图:stat_boxplot、线图:stat_abline、直方图:stat_bin
分面(facet):用来描述数据如何被拆分为子集,以及对不同子集是如何绘制的。
位置调整(position):对图形位置做精细控制。
创建ggplot对象:使用ggplot函数:
ggplot(data,mapping=aes(),...,environment=globalenv())
几何对象
几何对象函数 描述
geom_abline 线图,由斜率和截距指定
geom_area 面积图(即连续的条形图)
geom_bar 条形图
geom_bin2d 二维封箱的热图
geom_blank 空的几何对象,什么也不画
geom_boxplot 箱线图
geom_contour 等高线图
geom_crossbar crossbar图(类似于箱线图,但没有触须和极值点)
geom_density 密度图
geom_density2d 二维密度图
geom_errorbar 误差线(通常添加到其他图形上,比如柱状图、点图、线图等)
geom_errorbarh 水平误差线
geom_freqpoly 频率多边形(类似于直方图)
geom_hex 六边形图(通常用于六边形封箱)
geom_histogram 直方图
geom_hline 水平线
geom_jitter 点、自动添加了扰动
geom_line 线
geom_linerange 区间,用竖直线来表示
geom_path 几何路径,由一组点按顺序连接
geom_point 点
geom_pointrange 一条垂直线,线的中间有一个点(与Crossbar图和箱线图相关,可以用来表示线的范围)
geom_polygon 多边形
geom_quantile 一组分位数线(来自分位数回归)
geom_rect 二维的长方形
geom_ribbon 彩虹图(在连续的x值上表示y的范围,例如Tufte著名的拿破仑远征图)
geom_rug 触须
geom_segment 线段
geom_smooth 平滑的条件均值
geom_step 阶梯图
geom_text 文本
geom_tile 瓦片(即一个个的小长方形或多边形)
geom_vline 竖直线
统计变换
统计变换函数 描述
stat_abline 添加线条,用斜率和截距表示
stat_bin 分割数据,然后绘制直方图
stat_bin2d 二维密度图,用矩阵表示
stat_binhex 二维密度图,用六边形表示
stat_boxplot 绘制带触须的箱线图
stat_contour 绘制三维数据的等高线图
stat_density 绘制密度图
stat_density2d 绘制二维密度图
stat_function 添加函数曲线
stat_hline 添加水平线
stat_identity 绘制原始数据,不进行统计变换
stat_qq 绘制Q-Q图
stat_quantile 连续的分位线
stat_smooth 添加平滑曲线
stat_spoke 绘制有方向的数据点(由x和y指定位置,angle指定角度)
stat_sum 绘制不重复的取值之和(通常用在三点图上)
stat_summary 绘制汇总数据
stat_unique 绘制不同的数值,去掉重复的数值
stat_vline 绘制竖直线
标度函数
标度函数 描述
scale_alpha alpha通道值(灰度)
scale_brewer 调色板,来自colorbrewer.org网站展示的颜色标度
scale_continuous 连续标度
scale_data 日期
scale_datetime 日期和时间
scale_discrete 离散值
scale_gradient 两种颜色构建的渐变色
scale_gradient2 3中颜色构建的渐变色
scale_gradientn n种颜色构建的渐变色
scale_grey 灰度颜色
scale_hue 均匀色调
scale_identity 直接使用指定的取值,不进行标度转换
scale_linetype 用线条模式来展示不同
scale_manual 手动指定离散标度
scale_shape 用不同的形状来展示不同的数值
scale_size 用不同大小的对象来展示不同的数值
坐标系
坐标函数 描述
coord_cartesian 笛卡儿坐标
coord_equal 等尺度坐标(斜率为1)
coord_flip 翻转笛卡儿坐标
coord_map 地图投影
coord_polar 极坐标投影
coord_trans 变换笛卡儿坐标
分面
分面函数 描述
facet_grid 将分面放置在二维网格中
facet_wrap 将一维的分面按二维排列
位置
定位函数 描述
position_dodge 并列
position_fill 填充
position_identity 不对位置进行处理
position_jitter 扰动处理
position_stack 堆叠处理
- 散点图
先提出一个问题 , 汽车排放量和高速路上的每公里耗油量有什么关系? 这两个变量都是数值变量 , 可以先用散点图的形式将它们的关系展示出来:
p = ggplot(data = mpg, mapping = aes(x = displ, y = hwy)) ##把数据中的变量映射到图形属性上。以排量(displ)数为X轴变量,高速耗油量(hwy)为Y轴变量。
p + geom_point() ## 这些数据要映射成什么样的几何对象(这里是散点图geom_point)
等于
ggplot(data = mpg) + geom_point(mapping = aes(x = displ, y = hwy)) ##散点图
在属性映射中加入 color=class 参数后 , 我们可以看到每个点的汽车对应的类型被用 不同颜色表现了出来 , 对于散点图 , 还有 size(大小) , shape(形状) 等等参数 可以用于确定点的属性。
- 条形图
参数:
fill:改变条形图的填充色;colour:添加边框线;position:改变条形图的类型;linetype:线型
scale_fill_brewer()和scale_fill_manual()设置颜色
scale_fill_brewer(palette="Pastell")
对于条形图的y轴就是数据框中原本的数值时,必须将geom_bar()函数中stat(统计转换)参数设置为’identity’,即对原始数据集不作任何统计变换,而该参数的默认值为’count’,即观测数量。
-
簇条形图
对于簇条形图只需在ggplot()函数的aes()参数中将其他离散变量赋给fill参数即可。这里的position参数表示条形图的摆放形式,默认为堆叠式(stack),还可以是百分比的堆叠式。下面分别设置这两种参数,查看一下条形图的摆放形式。
直接使用数值型变量作为条形图的x轴,我们会发现条形图之间产生空缺,这个空缺其实对应的是3和5两个值,这样的图形并不美观。为了能够使条形图之间不存在类似的空缺,需要将数值型的x转换为因子,即factor(x),如下图所示:
上面几幅图的颜色均为灰色的,显得并不是那么亮眼,为了使颜色更加丰富多彩,可以在geom_bar()函数内通过fill参数可colour参数设置条形图的填充色和边框色,例如:
关于颜色的选择可以在R控制台中输入colours(),将返回657种颜色的字符。如果想查看所有含红色的颜色值,可以输入colours()[grep(‘red’,
colours())]返回27种红色。
-
箱线图
geom_jitter() ##让图中的点自动添加扰动,不会聚到一块。
-
小提琴图
-
Wilkinson点图