【GS专栏】7-R语言基础

知识/政策规划

2021-03-02


  前面我们已经了解了基因组选择的基础理论知识,以及各类模型和常用软件。那么,从现在开始我们进入GS的实战。从之前的介绍中我们可以知道,R语言作为一种免费开源软件,在统计绘图方面有着很大的优势。在动植物育种中,很多研究者已经开发了不少R包来做GS应用。所以,这次我们主要介绍R语言的一些基础语法和常规操作,以便大家快速分析自己的数据。

 

  1. 准备

  R下载安装

  官方地址:https://www.r-project.org/。使用任一中国镜像,根据平台选择安装R软件版本:https://mirrors.tuna.tsinghua.edu.cn/CRAN/。

 

 

  RStudio下载安装

  如果你使用的是Windows平台,安装R后,虽然自带RGui,可在其中编程使用,但编写、调试和运行都不是太友好。于是,我们进一步下载安装R语言的编辑器Rstudio,更加自由使用。

  下载地址:https://rstudio.com/products/rstudio/download/,选择免费版本即可。

  完成后打开RStudio界面由三部分组成:程序编辑窗口、控制台(Console)以及工作空间(Workspace)和历史(History)窗口,你可以根据需求进行一些个性化的设置。

 

 

  2. 数据类型

  R语言种有向量c()、矩阵matrix()、数组array()、数据框dataframe()、列表list()、因子factor()等数据类型,这些类型对应的变量、数据、函数及其结果都可视为对象。

 

 

  向量

  向量是用于存储数值、字符或逻辑数据的一维数组。示例代码:

  > vector_a <- c(3, 2, 1, 3, 5, -2, 4) #赋值<- 或 =

  # 数据提取

  > vector_a[3]

  [1] 1

  > vector_a[c(1, 3, 5)]

  [1] 3 1 5

  > vector_a[2:6]

  [1] 2 1 3 5 -2

  > vector_a[vector_a>3] #条件筛选

  [1] 5 4

  > vector_a[-1]

  [1] 2 1 3 5 -2 4

  > vector_a[-1:-3]

  [1] 3 5 -2 4

 

  矩阵

  R 语言为线性代数的研究提供了矩阵类型,这种数据结构很类似于其它语言中的二维数组,但 R 提供了语言级的 矩阵运算支持。矩阵里的元素可以是数字、符号或数学式。

  示例代码:

  # 创建矩阵

  > matrix2<-matrix(data=1:12,nrow=3,ncol=4, byrow=F)

  > matrix2 #12个数字元素构成的3行4列的矩阵

  [,1] [,2] [,3] [,4]

  [1,] 1 4 7 10

  [2,] 2 5 8 11

  [3,] 3 6 9 12

  # 元素提取

  > matrix1[1,3]

  [1] 3

  > matrix1[,3]

  [1] 3 7 11

  > matrix1[1,]

  [1] 1 2 3 4

 

  矩阵的运算在GS应用中较为常见,这里介绍一些基本的矩阵操作

  • 生成矩阵

  > mat <- matrix(1:16,4,4)

  > mat

  [,1] [,2] [,3] [,4]

  [1,] 1 5 9 13

  [2,] 2 6 10 14

  [3,] 3 7 11 15

  [4,] 4 8 12 16

 

  • 对角矩阵

  # 提取mat主对角线

  > diag(mat)

  [1] 1 6 11 16

  # 生成对角线都为1的对角矩阵

  > diag(4)

  [,1] [,2] [,3] [,4]

  [1,] 1 0 0 0

  [2,] 0 1 0 0

  [3,] 0 0 1 0

  [4,] 0 0 0 1

 

  • 提取矩阵半三角

  # 提取矩阵上三角

  > mat[upper.tri(mat)]

  [1] 5 9 10 13 14 15

  # 提取矩阵下三角

  > mat[lower.tri(mat)]

  [1] 2 3 4 7 8 12

 

  • 矩阵转置

  > t(mat)

  [,1] [,2] [,3] [,4]

  [1,] 1 2 3 4

  [2,] 5 6 7 8

  [3,] 9 10 11 12

  [4,] 13 14 15 16

 

  • 矩阵加减

  > X=Y=matrix(1:16,nrow=4,ncol=4)

  > X + Y

  [,1] [,2] [,3] [,4]

  [1,] 2 10 18 26

  [2,] 4 12 20 28

  [3,] 6 14 22 30

  [4,] 8 16 24 32

  > X -Y

  [,1] [,2] [,3] [,4]

  [1,] 0 0 0 0

  [2,] 0 0 0 0

  [3,] 0 0 0 0

  [4,] 0 0 0 0

 

  • 数与矩阵相乘除

  > X/2

  [,1] [,2] [,3] [,4]

  [1,] 0.5 2.5 4.5 6.5

  [2,] 1.0 3.0 5.0 7.0

  [3,] 1.5 3.5 5.5 7.5

  [4,] 2.0 4.0 6.0 8.0

  > 2*Y

  [,1] [,2] [,3] [,4]

  [1,] 2 10 18 26

  [2,] 4 12 20 28

  [3,] 6 14 22 30

  [4,] 8 16 24 32

 

  • 矩阵相乘

  > X*Y

  [,1] [,2] [,3] [,4]

  [1,] 1 25 81 169

  [2,] 4 36 100 196

  [3,] 9 49 121 225

  [4,] 16 64 144 256

 

  • 矩阵求逆

  > a <- matrix(rnorm(16),4,4)

  > a

  [,1] [,2] [,3] [,4]

  [1,] -1.4401782 -0.7371397 1.026640 -0.1850072

  [2,] 1.5002015 -1.0638962 -2.962298 0.1512067

  [3,] -0.1657594 0.4230006 1.699419 -0.1965050

  [4,] -1.0052562 -1.2422555 1.790331 0.4707040

  > solve(a)

  [,1] [,2] [,3] [,4]

  [1,] -0.3534151 0.5095296 0.9865575 0.1092723

  [2,] -0.4298639 -0.6254940 -0.6002996 -0.2186319

  [3,] -0.1013534 0.0974694 0.6212788 0.1882186

  [4,] -1.5037420 -0.9333211 -1.8403857 1.0649503

 

  数组

  数组array和矩阵类似,但维度可大于2。示例代码:

  > # 为要创建的数组设置行列和维度名

  > column.names <- c("COL1","COL2","COL3")

  > row.names <- c("ROW1","ROW2","ROW3")

  > matrix.names <- c("matrix1","matrix2")

  >

  > # 创建数组

  > array1 <- array(1:18,

  + dim = c(3,3,2),

  + dimnames = list(row.names,column.names,matrix.names))

  > array1

  , , matrix1

  COL1 COL2 COL3

  ROW1 1 4 7

  ROW2 2 5 8

  ROW3 3 6 9

  , , matrix2

  COL1 COL2 COL3

  ROW1 10 13 16

  ROW2 11 14 17

  ROW3 12 15 18

 

  数据框

  数据框(Data frame)可以理解成我们常说的"表格",不同的列可包含不同类型的数据。示例代码:

  > # 创建数据框

  > df<-data.frame(Name=c("A", "B", "C", "D"),

  + Sex=c("M", "F", "M", "M"),

  + Age=c(23,25,24,26),

  + Score=c(84,98,88,99))

  >

  > # 提取数据

  > df[1,3]

  [1] 23

  > df[1:2,]

  Name Sex Age Score

  1 A M 23 84

  2 B F 25 98

  > df[1,1:3]

  Name Sex Age

  1 A M 23

  > df[2:3,1:3]

  Name Sex Age

  2 B F 25

  3 C M 24

 

  列表

  列表是 R 语言的对象集合,可以用来保存不同类型的数据,可以是数字、字符串、向量、另一个列表等,当然还可以包含矩阵和函数。示例代码:

  > # 列表包含向量、矩阵、列表

  > list_data <- list(c("biobin","google","tecent"), matrix(c(1,2,3,4,5,6), nrow = 2),

  + list("biobin",12.3))

  > # 给列表元素设置名字

  > names(list_data) <- c("Sites", "Numbers", "Lists")

  > list_data

  $Sites

  [1] "biobin" "google" "tecent"

  $Numbers

  [,1] [,2] [,3]

  [1,] 1 3 5

  [2,] 2 4 6

  $Lists

  $Lists[[1]]

  [1] "biobin"

  $Lists[[2]]

  [1] 12.3

  > # 访问元素

  > list_data[1]

  $Sites

  [1] "biobin" "google" "tecent"

 

  3. 控制结构

  条件结构

  • if语句

  > x <- 50L

  > if(is.integer(x)) {

  + print("X 是一个整数")

  + }

  [1] "X 是一个整数"

 

  • if...else语句

  > x <- c("biobin","google","tencent")

  > if("weibo" %in% x) {

  + print("第一个 if 包含 weibo")

  + } else if ("biobin" %in% x) {

  + print("第二个 if 包含 runoob")

  + } else {

  + print("没有找到")

  + }

  [1] "第二个 if 包含 runoob"

 

  • switch语句

  > x <- switch(

  + 3,

  + "google",

  + "biobin",

  + "tencent",

  + "weibo"

  + )

  > print(x)

  [1] "tencent"

 

  循环结构

  • while语句

  > v <- c("Google","Biobin")

  > cnt <- 2

  > while (cnt < 7) {

  + print(v)

  + cnt = cnt + 1

  + }

  [1] "Google" "Biobin"

  [1] "Google" "Biobin"

  [1] "Google" "Biobin"

  [1] "Google" "Biobin"

  [1] "Google" "Biobin"

 

  • for语句

  > v <- LETTERS[1:4]

  > for ( i in v) {

  + print(i)

  + }

  [1] "A"

  [1] "B"

  [1] "C"

  [1] "D"

 

  • apply函数族

  > # 创建示例数据

  > rname = c("one","two","three")

  > cname = c("first","second")

  > b <- matrix(1:6,nrow=3, dimnames = list(rname, cname))

  > b

  first second

  one 1 4

  two 2 5

  three 3 6

  >

  > # 对每行求和

  > apply(b,1,sum)

  one two three

  5 7 9

  > # 对每列求均值

  > apply(b,2,mean)

  first second

  2 5

 

  4. 常用函数

  常用对象查看和处理函数

  • 帮助:?function,help(function)

  • 数据读取:read.table(),read.csv()

  • 数据写入:write.table(),write.csv()

  • 加载包:library()

  • 安装包:install.packages()

  • 对象长度/数量:length()

  • 数据维度:dim()

  • 数据结构:str()

  • 数据类型:class()

  • 数据元素名称:names()

  • 查看数据前6行:head()

  • 查看数据后6行:tail()

  • 查看当前对象列表:ls()

  • 删除对象:rm()

  • 判断数据类型:is.numeric()/is.character()/is.vector()/is.matrix()/is.data.frame()/is.factor()

  • 转化数据类型:as.numeric()/as.character()/as.vector()/as.matrix()/as.data.frame()/as.factor()

  • 数据转置:t()

  • 添加行:rbind()

  • 添加列:cbind()

  • 合并数据集:merge()

  • 数据筛选:subset()

  • 查找:grep()

  • 替换:sub()

 

  统计计算相关函数

  • 数据概要:summary()

  • 统计概括信息:describe()

  • 均值中位值:mean(),median()

  • 求和:sum()

  • 最大最小值:max(),min()

  • 分位数:quantile()

  • 方差标准差:var(),sd()

  • 分类汇总:table()

  • 绝对值:abs()

  • 平方根:sqrt()

  • 正态分布函数:rnorm()

  • 均匀分布函数:runif()

 

  5.资源推荐

  以上介绍了常用的R基本语法知识,要想系统学习R,至少需要阅读2-3本基础教程,这里做个推荐。

  • 《R语言实战 第二版》

  • 《R for Data Science》[1]

  • 《ggplot2:数据分析与图形艺术》

  • 《Advanced R 第二版》[2]

  今天的内容分享到这里啦。R语言基础是后续GS实战的基础,希望大家有所了解,多加练习,争取早日分析自己的数据。


相关推荐

百奥繁育 | 良种选育的信息管理系统

百奥繁育 | 良种选育的信息管理系统

09-06

2023

江西种业也刮智能育种风

8月25日,江西省水稻种质资源创新交流及智能育种技术研讨会在江西省农科院顺利召开。江西农业大学、江西师范大学、广东省农科院、江西省农科院、中国水稻所江西早稻中心、南昌市农科院、赣州市农科所有关专家代表以及省内种企代表共约40人参与了本次交流会议。

08-28

2023

百奥云 & 火山引擎 | 为现代农业的“芯片”增添新科技

育种4.0时代,比拼的是科技创新,关键是通过数字化、信息化、智能化让育种过程缩短周期、提升效率、降低风险,而这也是长沙百奥云数据科技有限公司(百奥云)的创业初衷。

08-22

2023

百奥繁育 | 育种田间的信息流水线

有人说,植物育种的过程就像工厂流水线。挑选的种质即原材料,根据市场需求进行设计与加工,送入田间生产线后,一代代优中选优,还得经过严格的产量、品质、抗性测试,过五关斩六将,最终拿到审定编号,成为可以推广的成熟产品。 虽然流程相似,但育种工作远不及工厂生产那样标准。田间环境气候复杂、真实性状判断困难、水肥条件难以统一……种种困难下,选育良种成了概率事件,育种家们都有种“尽人事听天命”的无奈感。

08-22

2023

百奥云新品发布 | 高质量基因组极速拼接服务

1. 利用PopGenomics快速对基因组实现高质量组装 基因组组装是将全基因组测序的小片段(reads长度100 bp-100 kb)通过算法拼接成尽量长的片段(contig 和scaffold,长度几十kb 到Mb 不等)或者整条染色体的过程。获得包含基因组全序列的参考基因组是对动植物进行基因组学研究和育种利用的前提[1]。 由于植物基因组具有非常丰富的多样性,参考已发表的少数物种组装新的物种,有时却无法达到理想的组装效果。测序技术发展提供了短序列测序、单分子测序、光学图谱、Hi-C 图谱等多种测序技术及其组合的组装方案,到目前为止,已经有上千个植物基因组被组装(图1)。然而,如何以最低成本快速获得满足需求的高质量基因组,仍然是科研人员和育种数据分析人员普遍面临的一个问题。

08-22

2023

夏风又绿田间草,除草劳动正当时

7月26日,顶着炎炎夏日 在公司CSO桂進老师的带领下 举行了一场别开生面的劳动体验。

08-04

2023