R语言之基础

一: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(形状) 等等参数 可以用于确定点的属性。


color=class
  • 条形图
参数:
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),如下图所示:


    数值型x转换为因子

    上面几幅图的颜色均为灰色的,显得并不是那么亮眼,为了使颜色更加丰富多彩,可以在geom_bar()函数内通过fill参数可colour参数设置条形图的填充色和边框色,例如:
    加颜色

    关于颜色的选择可以在R控制台中输入colours(),将返回657种颜色的字符。如果想查看所有含红色的颜色值,可以输入colours()[grep(‘red’,

    colours())]返回27种红色。

  • 箱线图
    geom_jitter() ##让图中的点自动添加扰动,不会聚到一块。


    箱线图
  • 小提琴图


    小提琴图
  • Wilkinson点图


    Wilkinson图
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,732评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,496评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,264评论 0 338
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,807评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,806评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,675评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,029评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,683评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 41,704评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,666评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,773评论 1 332
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,413评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,016评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,978评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,204评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,083评论 2 350
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,503评论 2 343

推荐阅读更多精彩内容

  • 《R语言入门》的读书笔记 本书的重点内容及感悟: 第一章 导言 1、R是一个有着统计分析功能及强大作图功能的软件系...
    格式化_001阅读 12,578评论 0 9
  • 简介 R语言是一套开源的数据分析解决方案。R语言中提供了多种存储数据的对象类型,包括标量(R语言中的标量是由向量的...
    Chouear阅读 4,768评论 3 3
  • 更多内容请参考《R语言编程艺术》——————————————— 向量类型是R语言的核心。深入理解向量对R中数据结构...
    Y大宽阅读 3,506评论 0 13
  • 最近,朋友嘟嘟的情绪一直不大好,看着身边的人一个一个都有了男朋友,她也想找个对象啊,可她不愿意将就,可她还没遇到对...
    一颗半糖阅读 616评论 0 2
  • 01. 乌龟在地上是跑不过兔子,可乌龟在水里永远比兔子游得快。 —— 不要放错自己的位置。 02. 乌鸦学老鹰去抓...
    曹丞鈁湲阅读 319评论 0 0