3  R语言基础

R语言是一种用于统计计算和图形展示的编程语言和软件环境,广泛应用于数据分析、统计建模和数据可视化。1991年:R语言的最初构想源自新西兰奥克兰大学的统计学家Ross Ihaka和Robert Gentleman。他们受到S语言(由John Chambers等人在贝尔实验室开发的统计编程语言)的启发,开始开发一个自由、开源的统计编程环境。1995年:R语言首次发布。Ross Ihaka和Robert Gentleman将R的代码发布到statlib(一个用于统计软件和数据的在线服务)上。1997年:R的代码以GNU通用公共许可证(GPL)发布,正式成为开源项目。这一决定吸引了许多开发者和统计学家的兴趣和贡献。1997年:为了更好地管理和推动R的发展,R核心开发团队(R Core Team)成立。这个团队负责R语言的维护和新功能的开发。1997年:The Comprehensive R Archive Network(CRAN)成立,成为R软件包和文档的主要分发平台。CRAN的建立大大促进了R语言的传播和使用。2000年代:R语言在学术界和研究机构中迅速普及,成为数据分析和统计研究的标准工具之一。CRAN上的软件包数量快速增长,涵盖了广泛的统计方法和数据分析领域。2010年代:R语言的影响力进一步扩展到工业界、金融业、生物信息学等多个领域。随着大数据和数据科学的兴起,R成为数据科学家和分析师的重要工具。2013年:RStudio公司成立,开发了RStudio集成开发环境(IDE),极大地提升了R语言的开发体验和用户友好性。2015年:R Consortium成立,这是一个由企业和研究机构组成的非营利组织,旨在支持R语言的发展和推广。R语言仍在不断发展,社区的活跃和丰富的软件包生态系统确保了其在数据科学和统计计算领域的持续重要性。现代R的发展还包括对大数据处理、高性能计算和机器学习等领域的支持。

数据类型有整型、逻辑型、字符型、日期型、数值型(单、双精度浮点型)等。

数据结构有向量、矩阵、数组、列表和数据框等。

3.1 数据类型

数据类型是指数据的分类和属性,决定了数据在内存中的存储方式以及可以对数据执行的操作

3.1.1 整型

整数 (Integer):整数类型的数据,可以用L后缀来标识。例如:42L。

c(1L, 2L)
[1] 1 2

3.1.2 逻辑型

用于表示布尔值,只有两个可能的取值:TRUEFALSE。可以用于条件判断和逻辑运算。

c(TRUE, FALSE)
[1]  TRUE FALSE

3.1.3 字符型

用于表示文本数据,字符串用双引号或单引号括起来。例如:“Hello”,‘World’。

c("A", "B")
[1] "A" "B"

3.1.4 日期型

c(as.Date("2022-01-01"), as.Date("2022-01-02"))
[1] "2022-01-01" "2022-01-02"

3.1.5 数值型

双精度浮点数 (Double):默认的数值类型,用于表示实数。例如:3.14,42.0。

c(1, 1.2)
[1] 1.0 1.2

3.1.6 复杂数

用于表示复数,形式为实部加上虚部,例如:2 + 3i

3.2 数据结构

3.2.1 向量

R中最基本的数据结构,可以包含相同类型的元素。向量可以是数值、字符、逻辑或复数。例如:c(1, 2, 3)c("a", "b", "c")

3.2.2 矩阵

矩阵是二维的数组,只能包含相同类型的数据,通常用于线性代数计算。例如:matrix(1:6, nrow = 2, ncol = 3)

3.2.3 数组

数组是多维的矩阵,可以包含相同类型的数据。例如:array(1:8, dim = c(2, 2, 2))

3.2.4 列表

列表是一种通用的数据类型,可以包含不同类型的数据。列表中的元素可以是向量、矩阵、数据框,甚至是另一个列表。例如:list(1, "a", TRUE, c(1, 2, 3))

3.2.5 因子

用于表示分类数据,存储的是整数向量以及对应的分类水平(labels)。因子常用于统计建模中。例如:factor(c("male", "female", "female", "male"))

3.2.6 数据框

数据框是二维的表格数据结构,每列可以包含不同类型的数据,类似于数据库表或Excel工作表。数据框是数据分析中常用的结构。例如:data.frame(Name = c("Alice", "Bob"), Age = c(25, 30))

3.2.7 ts

ts 类型用于表示时间序列数据,是继承自数组类型的。给定数据、采样初始时间、采样频率的情况下,利用内置的函数 ts() 构造一个 ts 类型的分钟级的时间序列对象。

x <- ts(
  data = rnorm(100),
  start = c(2017, 1),
  frequency = 365.25 * 24 * 60,
  class = "ts", names = "Time_Series"
)

ts() 函数的 startfrequency 参数很关键,前者指定了时间单位是天,后者指定每个时间单位下的数据点的数量。其中 365.25 是因为每隔 4 年有 366 天,平均下来,每年算 365.25 天。每隔 1 / (24 * 60) 天(即 1 分钟)采样一个点。如果初始时间不是从一年的第1分钟开始,而是从此时此刻 2023-01-31 10:43:30 CST 开始,则可以换算成今年的第 30 * 24 * 60 + 9 * 60 + 43 = 43783 分钟,则 Start = c(2023, 43783)

以数据集 x 为例,它是一个 ts 类型的时间序列数据对象。时间序列对象有很多方法,如函数 class()mode()str() 分别可以查看其数据类型、存储类型和数据结构。

# 数据类型
class(x)
[1] "ts"
# 存储类型
mode(x)
[1] "numeric"
# 数据结构
str(x)
 Time-Series [1:100] from 2017 to 2017: 1.0038 0.0415 -1.8712 -0.2486 -1.7356 ...

函数 start()end() 查看开始和结束的时间点。

c(start(x), end(x))
[1] 2017    1 2017  100

函数 time() 可以查看在以上时间区间的划分。

time(x)
Time Series:
Start = c(2017, 1) 
End = c(2017, 100) 
Frequency = 525960 
  [1] 2017 2017 2017 2017 2017 2017 2017 2017 2017 2017 2017 2017 2017 2017 2017
 [16] 2017 2017 2017 2017 2017 2017 2017 2017 2017 2017 2017 2017 2017 2017 2017
 [31] 2017 2017 2017 2017 2017 2017 2017 2017 2017 2017 2017 2017 2017 2017 2017
 [46] 2017 2017 2017 2017 2017 2017 2017 2017 2017 2017 2017 2017 2017 2017 2017
 [61] 2017 2017 2017 2017 2017 2017 2017 2017 2017 2017 2017 2017 2017 2017 2017
 [76] 2017 2017 2017 2017 2017 2017 2017 2017 2017 2017 2017 2017 2017 2017 2017
 [91] 2017 2017 2017 2017 2017 2017 2017 2017 2017 2017

函数 tsp() 可以查看其期初、期末和周期。

tsp(x)
[1]   2017   2017 525960

3.3 特殊值

3.3.1 缺失值 (NA)

表示缺失数据,在数据处理中需要特别注意。例如:c(1, 2, NA, 4)

3.3.2 无穷大 (Inf)

用于表示正无穷大和负无穷大。例如:1/0会返回Inf-1/0会返回-Inf

3.3.3 非数字 (NaN)

表示不是一个数字(Not a Number),通常在数值运算未定义时返回。例如:0/0会返回NaN

3.4 安装R包

  • 从特定CRAN镜像安装: 清华大学的镜像网站安装指定的扩展包:
options(repos=c(CRAN="https://mirror.tuna.tsinghua.edu.cn/CRAN/"))
install.packages("devtools")
  • 从Github安装扩展包:扩展包没有在CRAN系统提供
if (!requireNamespace(c("remotes", "devtools"), quietly=TRUE)) {
  install.packages(c("devtools", "remotes"))
}

devtools::install_github("HuaZou/MicrobiomeAnalysis", 
                         dependencies = c("Depends", "Imports", "LinkingTo"),
                         repos = c("https://cloud.r-project.org/",
                                   BiocManager::repositories()))
  • 从BioConductor安装扩展包:扩展包没有在CRAN系统提供
options(repos=c(CRAN="https://mirror.tuna.tsinghua.edu.cn/CRAN/"))
if (!requireNamespace("BiocManager", quietly = TRUE)) {
  install.packages("BiocManager")
}
options(BioC_mirror="https://mirrors.tuna.tsinghua.edu.cn/bioconductor")
BiocManager::install(c("Biostrings"))