点击关注,桓峰基因
关注公众号,桓峰基因,每天更新不停歇!
有绘图需求的同学可以逛逛桓峰基因小店,店中没有的可以直接联系我添加!
研究肿瘤克隆进化的同学可以关注桓峰基因小店,本月15号下午3:30在线直播!!
最近有同学在使用代码中出现了很多基本问题解决困难,本来想直接进入绘图的主题,但是发现拿到代码根本不懂怎么操作,有人问为啥我们代码这么贵,代码漫天都是,但是我们是送上真心的服务,就像同样都去吃火锅,为什么海底捞菜量少还那么贵,但是大家仍然都去吃一个道理,凡是在我们这里购买的代码,全程包指导,直到做出自己想要的图表,达到满意为止的效果!
基于上述的原因我们也来分享两期R语言基础相关的内容,方便大家稍微了解一下,这样在数据变换的过程中自己能够轻松一些,得心应手!
前言
R 是一种区分字母大小写的解释性语言, R 语句的分隔符是分号( ;) 或换行符。当语句结束时,可以不使用分号, R 语言会自动识别语句结束的位置。R语言只支持单行注释,注释由#开头,当前行出现在#之后的任何文本都会被 R 解释器忽略。R 语句由函数和赋值构成。R 使用<-,而不是传统的 = 作为赋值符号。R 语言的数学运算跟我们平时的数学运算( 加+,减-,乘*,除/) 基本一致。在这里,我们会重点讲解与 R 语言数据可视化相关的编程基础内容。
一.数据类型
R 语言有很多不同的数据类型,用于储存不同的数据。我们最常用到的 4 种数据类型为数值型( numeric)、字符型( character)、日期型( date) 和逻辑型( logical)。变量中储存的数据类型都可以使用 class()函数查看。
①数值型( numeric) :
a <- 1
is.numeric(a) #输出判定 a 是否为数值型:TRUE
## [1] TRUE
②字符型( character) :
b <- "peter"
nchar(b) #输出字符串的长度为:4
## [1] 5
③日期型(date):
最常用的日期型数据类型是 Date(仅储存日期)和 POSIXct(同时储存日期与时间)
c <- as.Date("2012-06-12")
class(c) #输出 c 的数据类型为:'Date'
## [1] "Date"
d <- as.POSIXct("2012-06-12 17:32")
class(d) #输出 d 的数据类型为:'POSIXct' 'POSIXt'
## [1] "POSIXct" "POSIXt"
④逻辑型(logical) :
e <- TRUE
f <- FALSE
其中,在处理时序数据时,我们需要处理日期型数据,往往需要使用 as.Date()函数将读入的数据从数值型转换成日期型,有时候还需要进一步提取日期型数据的年、月、周等数据信息。此时我们需要使用 as.numeric()函数或者as.integer()函数将日期型数据转换成数值型。其中,strftime(x, format= "")函数可以定义日期型数据的格式,比如 strftime(c, '%Y')表示只显示年份。
Year <- as.integer(strftime(c, "%Y")) #输出年份:2012
Year
## [1] 2012
Month <- as.integer(strftime(c, "%m")) #输出月份:6
Month
## [1] 6
Week <- as.integer(strftime(c, "%W")) #输出周数:24
Week
## [1] 24
二. 数据结构
常见的数据结构包括:
向量( vector);
数据框( data.frame);
矩阵( matrix);
列表(list);
数组( array)。
其中,矩阵是将数据用行和列排列的长方形表格,它是二维的数组,其单元必须是相同的数据类型,通常用列来表示不同的变量,用行表示各个对象;数组可以看作是带有多个下标的类型相同的元素的集合;列表是一个对象的有序集合构成的对象,列表中包含的对象又称为它的分量(component),分量可以是不同的模式或(和)类型。我们在本书的数据可视化中,比较常用的是向量(因子属于特殊的向量)和数据框,所以我们重点介绍这两种类型的数据结构,还将介绍与数据可视化密切相关的函数。
①向量
向量是用于存储数值型、字符型或逻辑型数据的一维数组。执行组合功能的函数c()可用来创建向量( c 代表合并:combine)。值得注意的是,单个向量中的数据类型是固定的,比如数值型向量中的元素就必须全为向量。量是 R 语言中最基本的数据结构, 其他类型的数据结构都可以由向量构成。最常见的向量有三种类型:数值型、 字符型、 逻辑型。
(1)向量的创建
向量的创建有多种方法,我们既可以手动输入,使用函数 c()创建向量;也可以使用现有的函数创建向量,比如 seq()、 rep()等函数。
# 将元素连接成向量
c(2, 4, 6)
## [1] 2 4 6
# 等差整数数列
2:6
## [1] 2 3 4 5 6
# 步长为 0.5 的等差数列
seq(2, 3, by = 0.5)
## [1] 2.0 2.5 3.0
# 将一个向量重复 3 次
rep(1:2, times = 3)
## [1] 1 2 1 2 1 2
# 将一个向量中的每个元素重复 3 次
rep(1:2, each = 3)
## [1] 1 1 1 2 2 2
# 均值为 0、 标准差为 3 的正态分布
rnorm(3, mean = 0, sd = 3)
## [1] -4.413037 -3.747793 -0.978693
# 最大值为 1、 最小值为 0 的均匀分布
runif(3, min = 0, max = 1)
## [1] 0.4282270 0.7833365 0.2034276
# 从一个向量中随机抽取
sample(c("A", "B", "C"), 4, replace = TRUE)
## [1] "C" "B" "C" "B"
(2)向量的处理
向量的排序。向量的排序和数据框的排序有时候对数据的展示尤为重要,很多时候我们需要对 数 据 先 进 行 降 序 处 理 , 再 展 示 数 据 。sort() 函 数 可 以 实 现 对 向 量 的 排 序 处理:index.return=TRUE,表示返回排序的索引;decreasing = TRUE,表示降序处理。
Vec <- c(1, 4, 3, 5, 2)
order <- sort(Vec, index.return = TRUE, decreasing = TRUE)
向量的唯一值。unique()函数主要是返回一个删除了把重复元素或行的向量、数据框或数组。在需要对数据框根据某列进行分组运算时,需要使用该函数先获取类别总数。
Vec <- c("peter", "jack", "peter", "jack", "eelin")
Vec
## [1] "peter" "jack" "peter" "jack" "eelin"
Uni <- unique(Vec)
Uni
## [1] "peter" "jack" "eelin"
连续向量的离散化。在做数据挖掘模型时,我们有时会需要把连续型变量转换为离散型变量,这种转换的过程就是数据离散化,分箱就是离散化常用的一种方法。数据离散化最简单的方法就是使用 cut()函数自定义离散区间,从而对数据进行离散处理。
Vector <- c(10, 5, 4, 7, 6, 1, 4, 8, 8, 5)
Vector
## [1] 10 5 4 7 6 1 4 8 8 5
Cut <- cut(Vector, breaks = c(0, 3, 6, 9, 11), labels = c("0~3", "3~6", "6~9", ">9"),
right = TRUE)
Cut
## [1] >9 3~6 3~6 6~9 3~6 0~3 3~6 6~9 6~9 3~6
## Levels: 0~3 3~6 6~9 >9
(3)向量的索引
向量是多个元素的集合,当我们只需要指定或者说提取该向量中的某个元素时,就可以使用向量的索引( indexing)。向量元素有三种基本类型的向量索引:整数型,索引的是元素位置;字符型,索引的是名称属性;逻辑型,索引的是相同长度的逻辑向量对应的逻辑值为真的元素。
x <- c(1, 4, 3, 5, 2)
# 整数型索引,选择某个或多个元素:
x[2]
## [1] 4
x[-2]
## [1] 1 3 5 2
x[2:4]
## [1] 4 3 5
x[c(1, 4)]
## [1] 1 5
# 逻辑型索引,逻辑运算选择元素:
x[x > 2]
## [1] 4 3 5
x[x == 1]
## [1] 1
x[x <= 5]
## [1] 1 4 3 5 2
②因子
因子( factor) 是 R 语言中许多强大运算的基础,包括许多针对表格数据的运算,可分为类别型变量和有序型变量。因子可以看成是包含了额外信息的向量,这额外的信息就是不同的类别,称之为水平( level)。因子在 R 中非常重要,因为它决定了数据的分析方式, 以及如何进行视觉呈现。
(1)因子的创建
一个因子不仅包括分类变量本身, 还包括变量不同的可能水平( 即使它们在数据中不出现)。因子函数 factor()用下面的选项创建一个因子。对于字符型向量,因子的水平默认依字母顺序创建:
Cut <- c("Fair", "Good", "Very Good", "Premium", "Ideal")
Cut
## [1] "Fair" "Good" "Very Good" "Premium" "Ideal"
as.factor(Cut)
## [1] Fair Good Very Good Premium Ideal
## Levels: Fair Good Ideal Premium Very Good
(2)水平的更改
很多时候,按默认的字母顺序排序的因子很少能够让人满意。因此,可以指定 levels 选项来覆盖默认排序。更改因子向量的 levels 为("Good","Fair","Very Good","Ideal","Premium"),就需要使用factor()函数更改 levels。
factor(x = c("Fair", "Good", "Very Good", "Premium", "Ideal"), levels = c("Good",
"Fair", "Very Good", "Ideal", "Premium"), ordered = TRUE)
## [1] Fair Good Very Good Premium Ideal
## Levels: Good < Fair < Very Good < Ideal < Premium
(3)类型的转换
数值型因子向量的类型变换。有时候我们需要将数值型的因子向量重新转换成数值型向量,这时,我们需要使用 as.numeric(as.character())组合函数,而不能直接使用as.numeric()函数。其中as.character()函数表示将向量变成字符型,as.numeric()函数表示将向量变成数值型。
fac <- factor(x = c(1, 3, 5, 2), levels = c(5, 3, 2, 1), ordered = TRUE)
fac
## [1] 1 3 5 2
## Levels: 5 < 3 < 2 < 1
as.numeric(as.character(fac))
## [1] 1 3 5 2
as.numeric(fac)
## [1] 4 2 1 3
③数据框
数据框是 R 语言中的一个种表格结构,对应于数据库中的表,类似 Excel 中的数据表。数据框是由多个向量构成的,每个向量的长度相同。数据框类似矩阵,也是一个二维表结构。在统计学术语中,用行来表示观测( observation),用列来表示变量( variable)。
(1)数据框的创建与查看
创建数据框, 最简单的方法就是, 用同名的定义函数 data.frame(),输入每个变量的名称及对应的向量,每个向量的长度相同。一个数据框可能包含多个变量(向量),有时需要单独提取某个变量,使用特殊的符号来访问,由数据框变量名” 构成。
# 数据框的构建:
df <- data.frame(x = c("a", "b", "c"), y = 1:3, z = c(2, 5, 3))
df
## x y z
## 1 a 1 2
## 2 b 2 5
## 3 c 3 3
# 选取某一列:
df[, 2]
## [1] 1 2 3
df$y
## [1] 1 2 3
df[[2]]
## [1] 1 2 3
# 选取多列:
df[c("x", "y")]
## x y
## 1 a 1
## 2 b 2
## 3 c 3
df[, 1:2]
## x y
## 1 a 1
## 2 b 2
## 3 c 3
# 选取某一行:
df[2, ]
## x y z
## 2 b 2 5
# 选取多行:
df[1:2, ]
## x y z
## 1 a 1 2
## 2 b 2 5
# 选取某个元素:
df[2, 2]
## [1] 2
获取数据框的行数、列数和维数:nrow()、 ncol()、 dim()。 获取数据框的列名或行名:names()、 rownames()、colnames();重新定义列名:names(df)<-c("X","Y", "Z")。 观察数据框的内容:view(df)、 head(df, n=3)、 tail(df)。
(2)空数据框的数据组成
理清数据框中每列数据的数据类型在需要自己构造绘图的数据框数据信息时尤为重要。有时候,绘制复杂的数据图表的过程中,我们需要对现有的数据进行插值、拟合等处理时。下面举个我们使用过的前列腺癌的数据集,我们发现其中数据框中有三种数据类型:数值型,整型和逻辑性,如下:
library(ElemStatLearn)
data(prostate)
is.data.frame(prostate)
## [1] TRUE
head(prostate)
## lcavol lweight age lbph svi lcp gleason pgg45 lpsa
## 1 -0.5798185 2.769459 50 -1.386294 0 -1.386294 6 0 -0.4307829
## 2 -0.9942523 3.319626 58 -1.386294 0 -1.386294 6 0 -0.1625189
## 3 -0.5108256 2.691243 74 -1.386294 0 -1.386294 7 20 -0.1625189
## 4 -1.2039728 3.282789 58 -1.386294 0 -1.386294 6 0 -0.1625189
## 5 0.7514161 3.432373 62 -1.386294 0 -1.386294 6 0 0.3715636
## 6 -1.0498221 3.228826 50 -1.386294 0 -1.386294 6 0 0.7654678
## train
## 1 TRUE
## 2 TRUE
## 3 TRUE
## 4 TRUE
## 5 TRUE
## 6 TRUE
### 数据结构
str(prostate)
## 'data.frame': 97 obs. of 10 variables:
## $ lcavol : num -0.58 -0.994 -0.511 -1.204 0.751 ...
## $ lweight: num 2.77 3.32 2.69 3.28 3.43 ...
## $ age : int 50 58 74 58 62 50 64 58 47 63 ...
## $ lbph : num -1.39 -1.39 -1.39 -1.39 -1.39 ...
## $ svi : int 0 0 0 0 0 0 0 0 0 0 ...
## $ lcp : num -1.39 -1.39 -1.39 -1.39 -1.39 ...
## $ gleason: int 6 6 7 6 6 6 6 6 6 6 ...
## $ pgg45 : int 0 0 20 0 0 0 0 0 0 0 ...
## $ lpsa : num -0.431 -0.163 -0.163 -0.163 0.372 ...
## $ train : logi TRUE TRUE TRUE TRUE TRUE TRUE ...
三. 数据属性
数据框作为 R 语言数据分析与可视化很常用的数据结构, 常由多列不同数据属性的变量组成。在我们实现数据可视化时,很有必要先了解这些变量的属性。我们平时记录的实验数据所用的表( table)就是由一系列不同属性的变量组成的。Jiawei Han 等人的 Data mining: concepts and techniques根据数据属性取值的集合类型,对数据属性进行了分成三类:类别型、序数型和数值型,Pang-Ning Ta 等人的 Introduction to Data Mining,将序数型和类别型数据统称为类别型( categorical) 或者定性型( qualitative),将数值型( numeric) 也称为定量型( quantitative)
①类别型
类别型属性( categorical attribute) 是用于区分不同数据对象的符号或名称,而它们是没有顺序关系的, 又包含多元类别和二元类别两种类型。对于多元类别, 可以理解为购买服装时的不同服装名称,如衬衫、 毛衣、 T恤、夹克等;对于二元类别,可以理解为购买服装时的不同性别,只有男士和女士两种性别分类。类别型数据的可视化一般使用标尺类中的分类尺度。
② 序数型
序数型属性( ordinal attribute) 的属性值是具有顺序关系, 或者存在衡量属性值顺序关系的规则。比如常见的时序数据, 就一般是按时间先后排序的;还有就是平时调查问卷中经常使用的 5 个喜欢程度:非常喜欢、 比较喜欢、 无所谓、不太喜欢、 非常不喜欢。序数型数据的可视化一般使用标尺类中的顺序尺度和时间尺度两种类型。序数型数据的排列方向有三种,分别是单向型( sequential),有公共零点的双向型( diverging),以及环状周期型( cyclic)。
③数值型
数值型属性( numeric attribute) 使用定量方法表达属性值, 如整数或者实数,包括区间型数值属性( interval-scaled attribute) 和比值型数值属性( ratio-scaled attribute)。区间型与比值型数值最大的区别就是有无基准点, 通常为零点( internal zero-point)。比值型数值属性的数据一般拥有基准点,比如开氏温标(K)以绝对零度( 0K=−273.15C)为其零点,以及平时通常使用的数量、重量、 高度和速度等。我们也可以用值的个数区分数据类型,可以分为离散型和连续型。离散型属性具有有限个值或者无限个值,这样的属性可以是分类的,也可以是数值型的。其中二元属性( binary attribute) 是离散型属性的一种特殊情况,并只接受两个值,比如 True/False( 真/假)、 Yes/No( 是/否)、 Male/Female(男/女),以及0/1。通常二元属性使用布尔变量表示,或者只取 0 和 1 两个值的整数变量表示。连续型属性是取实数值的属性,通常使用浮点数变量表示。理论上讲,基于数据集合类型划分的数据类型(类别型、序数型和数值型)可以与基于属性值个数的任意类型( 离散型和连续型)组合,从而不同的数据可能有不同的数据属性组合。
以上内容参考网站:
https://github.com/EasyChart/Beautiful-Visualization-with-R
本期基本摘抄这本书的,如果觉得不错,就自己买一本把代码都实现一遍,基本上绘图不用愁了,书籍如下:
References:
- Tan,R., Introduction to data mining. 2007.174:p.245-245.
- Han,J.,J.Pei, and M.Kamber, Data mining:concepts and techniques. 2011:Elsevier.
本文使用 文章同步助手 同步