Chapter 2 第二章 R语言简介
2.2 R、R-Studio、R软件包的安装简介
2.2.2 R-Studio安装
R语言可以在计算机上通过终端命令直接运行,也有自己的图形界面。但是RStudio 是最适用于初学者的R 编程的集成开发环境(integrated development environment,IDE)。使用者可以在线下载并安装( http://www.rstudio.com/download )。其中免费版已经可以满足数据科学的需求了。
R语言可以在计算机上通过终端命令直接运行,也有自己的图形界面。但是RStudio 是最适用于初学者的R 编程的集成开发环境(integrated development environment,IDE)。使用者可以从 http://www.rstudio.com/download 下载并安装。其中免费版已经可以满足数据科学的需求了。
它提供了许多功能,如代码编辑器、调试器、数据可视化和包管理器等,使得R语言的学习和使用变得更加方便和高效。R-Studio被广泛用于数据科学、统计分析、机器学习和数据可视化等领域。
R-studio初始化
首先,初始界面有3个区域。在图中左侧区域是输入和运行代码区域,右侧上部的区域目前选中的是environment也就是环境变量的显示窗口。当前并没有输入任何代码,所以环境变量的窗口是空白。在右侧下部,对窗口有5个不同的按键:文件(File),制图(Plots),程序包(Packages),帮助(Help),视图(Viewer)。目前选中的是作图窗口。
2.2.3 R package软件包安装
R package是一种用于R语言的扩展工具,它可以包含数据、代码、文档等,用于实现特定的数据分析、可视化或模型建立任务。在R社区中,R语言允许用户自由地创建、发布和分享自己的package。这种开放性不仅促进了R语言的发展,也为用户提供了更多的选择和灵活性。这些软件包不仅可以提高数据分析的效率,还可以促进不同用户之间的知识交流和共享。
软件包安装可以使用代码,也可以使用R-Studio的界面。使用命令安装软件包: install.packages(“tidyverse”)。在使用软件包的功能时,我们需要先装载软件包,比如library(tidyverse)。
使用R-studio界面中,Package功能也能安装软件包。
R-studio中R软件包安装
不同软件包使用快捷指南:https://github.com/JuqiangJ/cheatsheets
2.3 R语言编程文档
大部分时候,我们需要对数据进行一系列的处理,因此相应的命名需要记录在一个文档中方便重复使用与修改。在R语言中,我们常用的编程文档有两种: R脚本(script)和R-markdown。
2.3.1 R脚本文档
新建脚本
当我们新建了一个脚本文件,就会出现一个窗口。原先的代码运行窗口,变换到了左边的下部,而在左边上部出现了一个新的窗口。这就是脚本书写窗口。在这里书写的脚本,我们可以通过选中来运行。
R-studio脚本视图
2.3.2 R-Markdown文档
R-markdown是一种可复制性更好的数据分析记录报告文件格式,符合可读性统计编程(literate statistical programming)的理念。它可以将数据分析的代码,统计建模的细节和解释说明的文字以及可视化的图片统一集成在一个文件当中。这个文件可以输出网页格式、PDF或者文档。
在R-studio中,选择文件—新建文件,选择R-markdown之后,会弹出对话框。在对话框中,你需要选择文件输出的类型。比如,这里我们选择网页格式。同时你可以填写相应的文件标题和文件作者名称。完成以后点击OK就可以了。
R-Markdown文件
之后,在R-studio里面会出现一个新的文件即R-markdown文件。这个文件最开头,从第二行到第五行,是一些相关属性设置。比如,文件名称、作者、时间和输出格式。
在图中第八行到第十行之间,有一个代码块区域。在这里书写代码,完成之后,可以选中,进行运行。也可以点击右面绿色小三角,运行整个代码块。
R-Markdown报告文件
在每个代码块开头的{r setup, include = FALSE}中,可以控制是否运行代码,是否输出结果,是否显示代码,是否显示代码运行中的提示(Messages)和警告(Warnings)。比如上述代码中,“setup”是这个代码块的名称,include = FALSE说明该代码会运行但是代码本身不会显示,相应的运行结果、图片、提示和警告也不会显示。

2.3.3 建立R-project
在数据处理中,我们通常会将输入和输出的数据放在一个文件夹里,每次导入数据的时候,我们需要输入绝对或者相对的路径。但是当你的合作者在另外一台电脑上打开你的文件夹时,这个绝对或者相对的路径就会发生错乱。因此,为了保持编程环境的相对稳定,我们可以为自己的数据处理项目建立一个project文件夹。当我们有一个project文件夹以后,R-studio里面就只需要输入相对路径。特别值得注意的是,无论是在云端同步,还是通过移动硬盘U盘等复制,这个文件夹是一个独立的编程环境。 首先,我们点击文件新建项目。然后,我们可以选择新建项目或者使用已有的文件夹。如果选择新建项目,那么需要给项目文件夹一个名称,并设置文件夹的位置。 新建项目以后,在所指定的路径,就会发现一个新的文件夹。在该文件夹内部,会有一个R-project文件。以后每次开始项目时,双击这个文件就会自动打开一个项目编程环境,里面所有路径都可以是相对路径。
第一步新建New project
第二步选择文件夹
第三步选择项目类型
第四步输入项目名称
在项目文件夹内,需要对不同数据和文件进行管理。我们可以参考Cookiecutter Data Science 的建议,在项目文件下设置子文件夹。
文件夹结构
├── README.md <- 介绍项目整体及注意事项 | ├── data │ ├── external <- 元数据比如被试信息 │ ├── interim <- 中间数据,比如初步处理的数据 │ ├── processed <- 最终数据,用于建模和汇报 │ └── raw <- 原始数据比如音频和标注文件 │ ├── docs <- 文档介绍 │ ├── references <- 必要的参考文献 │ ├── reports <- 最后的报告以及R-markdown │ ├── src <- 项目使用的所有代码
2.5 课堂任务
任务2.1 创建不同类型的向量
#创建一个包含整数的向量
vector <- c(1, 2, 3, 4, 5)
# 创建不同类型的向量
# 数值型
a = 8:17
b <- c(9, 10, 100, 38)
# 布尔型
c = c (TRUE, FALSE, TRUE, FALSE)
c = c (T, F, T, F)
# 字符型
d = c ("TRUE", "FALSE", "FALSE")
# 改变向量的类型
as.vector(b, mode = "character")值得注意的是,如果不同类型的数据被放入同一个向量,数据类型会发生改变。数值型数据会强制改变为字符型数据或布尔型数据。
除了单个输入之外,我们可以借助R语言的一些函数,批量生成向量中的元素。
A = 9:20 + 1 # A 是一个从9到20的向量,并且每个元素都加上了1。
B = seq(1, 10)# B 是一个从1到10的向量,其中的数字是连续的。
C = seq(1, 20, by = 2)#C 是一个从1到20的向量,步长为2,也就是只包含奇数。
D = rep(5, 4)# D 是一个包含了4个5的向量。
E = rep(c(1, 2, 3), 4)# E 是一个重复了4次的向量,其中包含了1、2、3这三个元素。
G = rep(c(1, 2, 3), each = 4)# G 是一个重复了4次的向量,其中每个元素都重复了4次,即先重复1四次,然后重复2四次,最后重复3四次。R语言中的一些基本函数,可以对包含不同类型数据的向量进行操作。
任务2.2 数值型向量的简单计算
# sum(): 计算向量中所有元素的和。
vector <- c(1:50)
sum(vector)
# mean(): 计算向量的平均值。
mean(vector)
# median(): 计算向量的中位数。
median(vector)
# min(): 返回向量中的最小值。
min(vector)
# max(): 返回向量中的最大值。
max(vector)
# sort(): 将向量中的元素按升序排序。
sort(vector)
# rev(): 反转向量中元素的顺序。
rev(vector)
# unique(): 返回向量中唯一的元素。
vector = c(1,2,33,4,4,4,5,6,345)
unique(vector)
# range(): 返回向量的取值范围(最小值和最大值)。
range(vector )
quantile(vector)
round(sd(vector), 2)针对字符串型向量的函数
# paste(): 将向量中的元素连接为一个字符串。
vector <- c("我", "爱", "XXX!")
paste(vector, collapse = " ")
# tolower(): 转换向量中的字符为小写。
vector <- c("HELLO", "WORLD", "!")
tolower(vector)
# toupper(): 转换向量中的字符为大写。
vector <- c("hello", "world", "!")
toupper(vector)
# grep(): 在向量中搜索满足条件的模式,并返回其索引。
vector <- c("苹果", "香蕉", "胡萝卜", "橙子")
grep("果", vector)任务2.3 列表的简单操作
# unlist() 函数:将list转换为向量。
my_list <- list("apple", "banana", "orange")
unlist(my_list)
# lapply():对list中的每个元素应用一个函数。
my_list <- list(1:3, 4:6, 7:9)
lapply(my_list, mean)
# sapply():对list中的每个元素应用一个函数,并将结果简化为向量。
my_list <- list(1:3, 4:6, 7:9)
sapply(my_list, mean)在建立回归模型后,可以将结果存储在一个列表中。
# 这行代码使用R中的lm()函数(线性模型)来拟合一个线性回归模型。模型的目标(因变量)是mpg(每加仑英里数),预测变量(自变量)是hp(马力)。数据源是R自带的mtcars数据集。
model <- lm(mpg ~ hp, data = mtcars)
# 这行代码创建一个列表,其中包含了线性模型的系数(coefficients)、残差(residuals)和拟合值(fitted.values)。
model_summary <- list(coefficients = model$coefficients,
residuals = model$residuals,
fitted.values = model$fitted.values)
#这行代码返回并打印model_summary列表的内容。
model_summary任务2.4 矩阵的简单操作
在这个示例中,我们首先创建了一个从1到6的向量 data,然后我们创建了一个3行2列的矩阵 matrix1,并将这个向量的数据按列存入矩阵。输出的结果会是一个3行2列的矩阵,元素值按列从1到6。
任务2.5 数据框的简单操作
数据框是一种表格形式的数据结构。数据框可以包含不同类型的列,但是每列长度必须相同。数据框可以使用data.frame()函数创建,并可以使用列名称或索引来访问和修改数据框中的数据。
任务2.6 数组的简单操作
数组是一个可以存储具有相同数据类型元素的多维数据结构。可以使用array()函数创建数组。
# 创建一个一维数组:
data <- 1:10
array1 <- array(data, dim = c(10))
print(array1)
# 在这个示例中,我们首先创建了一个从1到10的向量 data,然后我们创建了一个一维数组 array1,并将这个向量的数据存入数组。输出的结果会是1到10的一维数组。
# 创建一个二维数组:
data <- 1:12
array2 <- array(data, dim = c(3, 4))
print(array2)
# 在这个示例中,我们创建了一个二维数组 array2,它有3行4列。输出的结果会是一个3行4列的二维数组,元素值从1到12。
# 创建一个三维数组:
data <- 1:24
array3 <- array(data, dim = c(2, 3, 4))
print(array3)
# 在这个示例中,我们创建了一个三维数组 array3,它有2个2行3列的面。输出的结果会是一个2行3列,共有2个面的三维数组,元素值从1到24。任务2.7 文件系统批量操作练习
第一步:直接创建文件夹和文件结构
# 1. 设置工作路径(请在桌面或指定位置手动创建 'File_Exercise' 文件夹)
setwd("~/Desktop/File_Exercise") # 根据你的系统修改路径
getwd() # 确认工作目录
# 2. 直接创建多个文件夹
dir.create("Project_A")
dir.create("Project_B")
dir.create("Archive")
# 3. 在每个文件夹中直接创建示例文件
# 在 Project_A 中创建文件
write.csv(data.frame(x = 1:3, y = letters[1:3]), "Project_A/data1.csv", row.names = FALSE)
write.csv(data.frame(test = 1:5), "Project_A/results1.csv", row.names = FALSE)
write.table(data.frame(id = 1:2), "Project_A/notes1.txt", row.names = FALSE)
# 在 Project_B 中创建文件
write.csv(data.frame(x = 10:12, y = letters[10:12]), "Project_B/data2.csv", row.names = FALSE)
write.csv(data.frame(test = 6:10), "Project_B/results2.csv", row.names = FALSE)
write.table(data.frame(id = 3:4), "Project_B/notes2.txt", row.names = FALSE)
# 4. 查看生成的结构
list.files(recursive = TRUE) # 递归列出所有文件第二步:批量获取文件路径
# 1. 获取所有.csv文件的完整路径(递归搜索)
list.files(pattern = "\\.csv$", recursive = TRUE, full.names = TRUE)
# 2. 获取Project_A文件夹下的所有文件路径
list.files("Project_A", full.names = TRUE)
# 3. 获取所有.txt文件的路径
list.files(pattern = "\\.txt$", recursive = TRUE, full.names = TRUE)第三步:批量复制文件
# 1. 创建目标文件夹
dir.create("Backup")
# 2. 批量复制所有CSV文件到Backup文件夹
csv_files = list.files(pattern = "\\.csv$", recursive = TRUE, full.names = TRUE)
file.copy(csv_files, "Backup")
list.files("Backup")
# 3. 复制Project_B的所有文件到Archive文件夹
file.copy(project_b_files <- list.files("Project_B", full.names = TRUE), "Archive")
list.files("Archive")第四步:批量移动/重命名文件
# 1. 移动所有.txt文件到Archive文件夹
txt_files = list.files(pattern = "\\.txt$", recursive = TRUE, full.names = TRUE)
new_txt_paths <- file.path("Archive", basename(txt_files)) # 构建新路径
file.rename(txt_files, new_txt_paths)
list.files("Archive", recursive = TRUE)
# 2. 批量重命名Backup文件夹中的文件(添加_backup后缀)
backup_files <- list.files("Backup", full.names = TRUE)
new_backup_names <- sub("\\.csv", "_backup.csv", backup_files) # 替换扩展名
file.rename(backup_files, new_backup_names)
list.files("Backup")第五步:批量删除文件
# 1. 删除Backup文件夹中的所有文件
file.remove(list.files("Backup", full.names = TRUE))
list.files("Backup")
# 2. 删除Archive文件夹中所有.txt文件
file.remove(list.files("Archive", pattern = "\\.txt$", recursive = TRUE, full.names = TRUE))
list.files(recursive = TRUE)
# 3. 删除整个Project_A文件夹(先删内容,再删文件夹)
unlink("Project_A", recursive = TRUE) # recursive=TRUE可删除非空文件夹
list.files(recursive = TRUE)