diff --git a/SD/20240321_0_R实践课程/_extensions b/SD/20240321_0_R实践课程/_extensions
new file mode 120000
index 0000000..74119e3
--- /dev/null
+++ b/SD/20240321_0_R实践课程/_extensions
@@ -0,0 +1 @@
+../../_extensions
\ No newline at end of file
diff --git a/SD/20240321_0_R实践课程/index.qmd b/SD/20240321_0_R实践课程/index.qmd
new file mode 100644
index 0000000..12c1d2b
--- /dev/null
+++ b/SD/20240321_0_R实践课程/index.qmd
@@ -0,0 +1,155 @@
+---
+title: "〇、R语言实践前篇"
+subtitle: 《区域水环境污染数据分析实践》
Data analysis practice of regional water environment pollution
+author: 苏命、王为东
中国科学院大学资源与环境学院
中国科学院生态环境研究中心
+date: today
+lang: zh
+format:
+ revealjs:
+ theme: dark
+ slide-number: true
+ chalkboard:
+ buttons: true
+ preview-links: auto
+ lang: zh
+ toc: true
+ toc-depth: 1
+ toc-title: 大纲
+ logo: ./_extensions/inst/img/ucaslogo.png
+ css: ./_extensions/inst/css/revealjs.css
+ pointer:
+ key: "p"
+ color: "#32cd32"
+ pointerSize: 18
+revealjs-plugins:
+ - pointer
+filters:
+ - d2
+---
+
+```{r}
+#| include: false
+#| cache: false
+lang <- "cn"
+require(tidyverse)
+knitr::opts_chunk$set(echo = TRUE)
+```
+
+## R语言实践部分课程简介
+
+**接下来的课程由我来带着大家一起学习、实践基于R语言的数据分析。**
+
+### 自我介绍
+
+- 苏命:来自中国科学院生态环境研究中心
+- 主要从事**水源水质水生态**方面的研究
+
+### 课件
+
+- 采用`R语言`+`quarto`完成
+- 网页公开:[https://drwater.rcees.ac.cn/course/public/RWEP/\@PUB/index.html](https://drwater.rcees.ac.cn/course/public/RWEP/@PUB/index.html)
+- 课件代码:[https://drwater.rcees.ac.cn/git/course/RWEP.git](https://drwater.rcees.ac.cn/git/course/RWEP.git)
+
+## 如何学习接下来的内容?
+
+- 上课形式:
+ - **实践操作为主**,目的是让每一位同学都能独立开展基于R的数据分析
+ - **2-3人一组**,自由分组,相互帮助
+- 准备工作:
+ - 个人笔记本电脑,Microsoft Windows、GNU/Linux、MacOS系统
+ - 安装好**Microsoft Excel**
+ - 能联网
+ - 如果电池不够用,建议带上插座
+- 上课规则
+ - 可随时打断,**不懂就问**
+ - **无特殊情况不迟到**,否则操作过程容易跟不上
+
+## Rstudio Server使用
+
+- 服务网址:[https://drwater.rcees.ac.cn/rs1/](https://drwater.rcees.ac.cn/rs1/)
+- 每位同学使用1个账号,随机生成
+- 密码:\_RWEP_2024\_
+- 后面的实践课程可在该服务器上完成
+
+
+## 请记住自己的账号!
+
+::: {layout-ncol=2}
+
+```{r}
+#| echo: false
+#| output: asis
+coursememberdf <- readxl::read_xlsx("../../data/course_member.xlsx")
+nmem <- nrow(coursememberdf)
+set.seed <- 23
+
+uiddf <- coursememberdf |>
+ dplyr::mutate(uid = paste0("ruser", sprintf("%02d", sample(1:nmem, nmem)))) |>
+ dplyr::select(uid, 姓名) |>
+ dplyr::arrange(uid) |>
+ dplyr::mutate(group = (dplyr::row_number() - 1) %/% 10 + 1) |>
+ tidyr::nest(gdf = -group) |>
+ dplyr::mutate(tab = purrr::map(gdf, ~ knitr::kable(.x)))
+
+uiddf$tab[[1]]
+uiddf$tab[[2]]
+
+```
+:::
+
+## 请记住自己的账号!
+
+::: {layout-ncol=2}
+
+```{r}
+#| echo: false
+#| output: asis
+
+uiddf$tab[[3]]
+uiddf$tab[[4]]
+```
+:::
+
+## 课后作业
+
+提交形式:`第*次作业_姓名.qmd`文件
+
+模板:
+
+````
+---
+title: "课后作业*"
+author: 姓名
+---
+
+
+# 第1题
+
+说明
+
+```{r}
+# Here is the code
+
+```
+
+# 第2题
+
+说明
+
+```{r}
+# Here is the code
+
+```
+
+
+
+
+````
+
+
+
+## 欢迎讨论!{.center}
+
+
+`r rmdify::slideend(wechat = FALSE, type = "public", tel = FALSE, thislink = "https://drwater.rcees.ac.cn/course/public/RWEP/@PUB/SD/")`
+
diff --git a/SD/20240321_1_R语言介绍/_extensions b/SD/20240321_1_R语言介绍/_extensions
new file mode 120000
index 0000000..74119e3
--- /dev/null
+++ b/SD/20240321_1_R语言介绍/_extensions
@@ -0,0 +1 @@
+../../_extensions
\ No newline at end of file
diff --git a/SD/20240321_1_R语言介绍/index.qmd b/SD/20240321_1_R语言介绍/index.qmd
new file mode 100644
index 0000000..c55531a
--- /dev/null
+++ b/SD/20240321_1_R语言介绍/index.qmd
@@ -0,0 +1,222 @@
+---
+title: "一、R语言介绍"
+subtitle: 《区域水环境污染数据分析实践》
Data analysis practice of regional water environment pollution
+author: 苏命、王为东
中国科学院大学资源与环境学院
中国科学院生态环境研究中心
+date: today
+lang: zh
+format:
+ revealjs:
+ theme: dark
+ slide-number: true
+ chalkboard:
+ buttons: true
+ preview-links: auto
+ lang: zh
+ toc: true
+ toc-depth: 1
+ toc-title: 大纲
+ logo: ./_extensions/inst/img/ucaslogo.png
+ css: ./_extensions/inst/css/revealjs.css
+ pointer:
+ key: "p"
+ color: "#32cd32"
+ pointerSize: 18
+revealjs-plugins:
+ - pointer
+filters:
+ - d2
+---
+
+```{r}
+#| include: false
+#| cache: false
+lang <- "cn"
+require(tidyverse)
+require(learnr)
+knitr::opts_chunk$set(echo = TRUE)
+```
+
+## R的历史
+
+::: columns
+::: {.column width="85%"}
+
+- 1976年:
+ - 前身是S语言,由贝尔实验室John Chambers及其同事开发
+- 1993年:
+ - R语言由Ross Ihaka和Robert Gentleman在奥克兰大学开发
+ - R的诞生是为了提供一个强大的统计计算和图形显示的平台
+
+:::
+::: {.column width="15%"}
+
+![](https://cran.r-project.org/Rlogo.svg)
+
+:::
+:::
+
+
+- 1995年:R发布第一个公开版本
+- 2000年代: R语言逐渐成为统计学和数据科学领域重要工具
+- 2010年:Hadley Wickham发布了ggplot2包,数据可视化方面更强
+- 2016年:创建CRAN(Comprehensive R Archive Network),R包中央库
+- 至今
+ - **R语言已成为数据科学和统计学领域最受欢迎的工具之一,被广泛用于数据分析、机器学习、数据可视化等领域**
+
+
+
+## R的特点
+
+### 一般特点
+
+- 免费、开源、支持各个主要计算机系统。
+- 完整的程序设计语言,基于函数和对象。
+- 支持完善的数据类型,如向量、矩阵、数据框等。
+
+### 技术特点
+
+- 所有存在都是对象。
+- 所有动作都是函数调用。
+- 支持函数编程和对象类。
+- 是动态类型语言,运行速度相对较慢。
+
+## R的参考资料
+
+### 推荐参考书
+
+- Hadley Wickham and Garrett Grolemund(2022). [R for Data Science](https://r4ds.hadley.nz/)
+- Hadley Wickham(2019). [Advanced R](https://adv-r.hadley.nz/)
+- Hadley Wickham(2016). [ggplot2 Elegant Graphics for Data Analysis](https://ggplot2-book.org/)
+- John M. Chambers(2008). [Software for Data Analysis-Programming with R](https://www.springer.com/gp/book/9780387759357)
+- Venables, W. N. & Ripley, B. D.(2002). [Modern Applied Statistics with S (MASS)](https://www.springer.com/gp/book/9780387954578)
+
+
+## R的参考资料
+
+### 中文参考书
+
+- 《R语言编程艺术》
+- 《R语言实战》
+- 《R语言教程与实践》
+- 《R语言数据可视化实战》
+- 《R语言从入门到精通》
+
+## R的下载与安装
+
+### R的下载与安装
+
+- R的官方网站:[https://www.r-project.org/](https://www.r-project.org/)
+- CRAN镜像网站:[http://mirror.bjtu.edu.cn/cran/](http://mirror.bjtu.edu.cn/cran/)
+- 下载官方的R软件后按提示安装
+
+
+{{< video https://vimeo.com/203516510 width="600" height="400">}}
+
+## RStudio
+
+
+### 什么是RStudio?
+
+- RStudio官方网站: [https://posit.co/products/open-source/rstudio/](https://posit.co/products/open-source/rstudio/)
+- RStudio是一个集成开发环境(IDE),专门用于R语言编程和数据分析。
+- 它提供了一个直观的界面,使得编写、调试和运行R代码变得更加容易。
+
+
+## RStudio
+
+### RStudio的功能
+
+1. **代码编辑器**:提供了语法高亮、自动补全和代码折叠等功能。
+2. **控制台**:用于直接执行R代码并查看结果。
+3. **环境和历史记录**:可以查看当前加载的数据、函数和变量,以及之前执行过的命令。
+4. **图形和可视化**:RStudio内置了绘图设备,可以方便地创建各种统计图表。
+5. **文件管理器**:可直接在RStudio中管理文件和项目。
+6. **包管理器**:方便地安装、更新和管理R包。
+7. **Markdown编辑器**:支持Markdown格式,可以创建美观的文档和报告。
+
+## 如何获取RStudio?
+
+- RStudio可以从官方网站免费下载并安装:[RStudio官网](https://posit.co/download/rstudio-desktop/)
+- RStudio是一个强大的R编程环境,为R用户提供了丰富的功能和工具。
+- 它简化了R语言的使用,提高了数据分析和可视化的效率。
+
+
+{{< video https://vimeo.com/203516968 width="600" height="400">}}
+
+## 扩展包:R package
+
+- R有一万多个扩展软件包,提供了各种各样的功能
+- 已安装的基本R软件伴随一些必要的扩展包,如base, stats, graphics等,这些包在启动R时会默认载入
+- 其它扩展包需要用`library(.)`函数载入运行
+- 或者采用`dplyr::filter(.)`方式
+
+::: panel-tabset
+### Code
+
+```{r}
+#| echo: true
+#| eval: false
+#| out-width: 50%
+# load a R package
+library(ggplot2)
+
+# plot it based on the functions from `ggplot2` package
+mtcars |>
+ dplyr::filter(cyl != 8) |>
+ ggplot(aes(hp, mpg, color = am)) +
+ geom_point() +
+ geom_smooth(formula = y ~ x, method = "loess")
+```
+
+### Output
+
+```{r}
+#| echo: false
+#| out-width: 80%
+#| fig-width: 6
+#| fig-height: 3
+
+library(ggplot2)
+mtcars |>
+ dplyr::filter(cyl != 8) |>
+ ggplot(aes(hp, mpg, color = am)) +
+geom_point() +
+geom_smooth(formula = y ~ x, method = "loess")
+```
+:::
+
+
+## 安装R包
+
+- 以安装sos包为例。
+- 在RStudio中调用“Tools”菜单的“Install Packages”,输入或选择sos即可安装。
+- R图形界面安装
+- 如果不用RStudio, 在R图形界面选菜单“程序包-安装程序包”进行安装。
+- 在CRAN镜像选择窗口中选择中国的镜像,如“China (Beijing 2)”,然后选择要安装的扩展软件包名称即可完成下载和安装。
+- 程序安装
+
+```r
+# 指定镜像网站并安装扩展包
+options(repos=c(CRAN="https://mirror.tuna.tsinghua.edu.cn/CRAN/"))
+install.packages("sos")
+
+# 当R包不是CRAN标准包,代码放在[github](https://github.com)
+if (!require(devtools)) install.packages('devtools')
+devtools::install_github("kjhealy/socviz")
+```
+
+## 安装R包
+
+{{< video https://vimeo.com/203516241 width="600" height="400">}}
+
+
+## 结语
+
+- R语言是一种强大的统计计算和数据分析工具,适用于各种领域。
+- 通过学习R语言,可以进行数据处理、统计分析和数据可视化。
+
+
+## 欢迎讨论!{.center}
+
+
+`r rmdify::slideend(wechat = FALSE, type = "public", tel = FALSE, thislink = "https://drwater.rcees.ac.cn/course/public/RWEP/@PUB/SD/")`
diff --git a/SD/20240321_2_R语言语法基础/_extensions b/SD/20240321_2_R语言语法基础/_extensions
new file mode 120000
index 0000000..74119e3
--- /dev/null
+++ b/SD/20240321_2_R语言语法基础/_extensions
@@ -0,0 +1 @@
+../../_extensions
\ No newline at end of file
diff --git a/SD/20240321_2_R语言语法基础/index.qmd b/SD/20240321_2_R语言语法基础/index.qmd
new file mode 100644
index 0000000..2bd6e9a
--- /dev/null
+++ b/SD/20240321_2_R语言语法基础/index.qmd
@@ -0,0 +1,795 @@
+---
+title: "二、R语言语法基础"
+subtitle: 《区域水环境污染数据分析实践》
Data analysis practice of regional water environment pollution
+author: 苏命、王为东
中国科学院大学资源与环境学院
中国科学院生态环境研究中心
+date: today
+lang: zh
+format:
+ revealjs:
+ theme: dark
+ slide-number: true
+ chalkboard:
+ buttons: true
+ preview-links: auto
+ lang: zh
+ toc: true
+ toc-depth: 1
+ toc-title: 大纲
+ logo: ./_extensions/inst/img/ucaslogo.png
+ css: ./_extensions/inst/css/revealjs.css
+ pointer:
+ key: "p"
+ color: "#32cd32"
+ pointerSize: 18
+revealjs-plugins:
+ - pointer
+filters:
+ - d2
+---
+
+```{r}
+#| include: false
+#| cache: false
+lang <- "cn"
+require(tidyverse)
+require(learnr)
+knitr::opts_chunk$set(echo = TRUE)
+```
+
+
+## 数据类型
+
+### 数值型
+
+R中的数值型数据可以是整数或浮点数。
+
+```{r}
+#| echo: true
+(x <- 10)
+(y <- 1.23e-2)
+(z <- pi)
+```
+
+## 数据类型
+
+### 字符串
+
+- R 中的字符串用引号括起来,建议用**双引号**。
+- 中文编码主要有GBK编码和UTF-8编码, 可能遇到编码错误造成乱码。RStudio软件默认采用UTF-8编码,在R程序运行时字符串一般用UTF-8编码保存。
+
+```{r}
+#| echo: true
+(str <- "Hello, World!")
+(str <- 'Hello, World!')
+(str <- 'He was very angry, and shouted: "Stop!"')
+```
+
+
+
+## 数据类型
+
+### 逻辑
+
+```{r}
+c(TRUE, FALSE)
+
+```
+
+## 特殊值
+
+::: columns
+::: {.column width="45%"}
+- `NA`: 这是最常见的NA类型,表示缺失值
+- `NA_integer_`: 这是NA的整数类型
+- `NA_real_`: 这是NA的实数类型
+- `NA_character_`: 这是NA的字符类型
+- `NA_complex_`: 这是NA的复数类型
+
+:::
+::: {.column width="5%"}
+:::
+::: {.column width="45%"}
+```{r}
+#| echo: true
+pi
+NA
+NA_character_
+Inf
+```
+
+:::
+:::
+
+## 特殊值
+
+在 R 中,`Inf` 代表正无穷大(positive infinity),而 `-Inf` 则代表负无穷大(negative infinity)。这些值通常出现在数学计算中,例如除以零或对负数取对数等操作可能会导致无穷大的结果。
+
+```{r}
+#| echo: true
+# 正无穷大
+(x <- Inf)
+
+# 负无穷大
+(y <- -Inf)
+
+# 无穷大的运算
+(a <- 5 / 0)
+
+(b <- log(0))
+```
+
+
+
+
+## 变量赋值
+
+在 R 中,可以使用 `<-` 或 `=` 运算符将值赋给变量,**建议用`<-`**。
+
+
+```{r}
+#| echo: true
+# 使用 `<-` 运算符
+(x <- 10)
+(y <- "hello")
+
+# 使用 `=` 运算符
+(z = c(1, 2, 3))
+```
+
+## 变量赋值
+
+```{r}
+# 向量赋值
+(vec <- c(1, 2, 3, 4, 5))
+
+# 矩阵赋值
+(mat <- matrix(1:9, nrow = 3))
+
+```
+
+## 变量赋值
+
+### 数据框赋值
+
+```{r}
+#| echo: true
+
+(df <- data.frame(
+ Name = c("Alice", "Bob", "Charlie"),
+ Age = c(25, 30, 35),
+ Married = c(TRUE, FALSE, TRUE)
+))
+```
+## 变量赋值
+
+### 列表赋值
+
+```{r}
+
+(lst <- list(
+ numbers = c(1, 2, 3),
+ strings = c("a", "b", "c"),
+ matrix = matrix(1:9, nrow = 3)
+))
+```
+
+
+## 数学函数
+
+```{r}
+#| echo: true
+round(pi, digits = 3)
+log(10)
+```
+1. `abs(x)`: 返回 `x` 的绝对值
+2. `sqrt(x)`: 返回 `x` 的平方根
+3. `exp(x)`: 以e为底的指数函数值
+4. `log(x, base)`: 以指定底数的对数函数的值,默认底数为e
+5. `log10(x)`: 10为底的对数值
+6. `log2(x)`: 2为底的对数值
+7. `floor(x)`: 不大于`x`的最大整数
+8. `ceiling(x)`: 不小于`x`的最小整数
+
+## 数学函数
+
+9. `sin(x)`, `cos(x)`, `tan(x)`: 返回 `x` 的正弦、余弦和正切值,其中 `x` 为弧度
+10. `asin(x)`, `acos(x)`, `atan(x)`: `x` 的反正弦、反余弦和反正切值,返回弧度
+11. `sinh(x)`, `cosh(x)`, `tanh(x)`: 返回 `x` 的双曲正弦、双曲余弦和双曲正切值
+12. `asinh(x)`, `acosh(x)`, `atanh(x)`: 反双曲正弦、反双曲余弦和反双曲正切值
+13. `round(x, digits)`: `x` 四舍五入,`digits`指定小数点后位数
+14. `trunc(x)`: 返回`x`截断值,即去掉小数部分
+15. `sign(x)`: 返回符号
+
+
+## 统计函数
+
+```{r}
+#| echo: true
+x <- c(5, 10, 15, 20, 25)
+# 计算向量的平均值
+mean(x)
+
+# 计算向量的中位数
+median(x)
+
+# 计算向量的最小值
+min(x)
+
+# 计算向量的最大值
+max(x)
+
+# 计算向量的总和
+sum(x)
+
+```
+
+## 统计函数
+
+```{r}
+#| echo: true
+
+# 计算向量的标准差
+sd(x)
+
+# 计算向量的方差
+var(x)
+
+# 计算向量的分位数
+quantile(x, probs = c(0.25, 0.5, 0.75))
+
+# 统计向量的频数
+(frequency <- table(x))
+
+```
+
+
+## 统计函数
+
+
+### 执行两样本或单样本 t 检验
+
+```{r}
+#| echo: true
+y <- c(3, 8, 13, 18, 23)
+t.test(x, y)
+```
+
+## 统计函数
+
+### Wilcoxon-Mann-Whitney检验
+
+```{r}
+#| echo: true
+
+wilcox.test(x, y)
+```
+
+## 统计函数
+
+### 创建向量的直方图
+
+
+```{r}
+#| fig-width: 5
+#| fig-height: 3
+
+hist(x)
+```
+
+
+
+
+
+## 函数调用-练习
+
+### 题目:设有一组数据集合 x 包含了一些整数,请编写R语言代码计算并输出以下指标:
+
+- 平均值(mean)
+- 中位数(median)
+- 最大值(maximum)
+- 最小值(minimum)
+- 数据集合中所有元素的和(sum)
+- 数据集合的标准差(standard deviation)
+- 数据集合 x 为:x <- c(10, 20, 30, 40, 50, 60, 70, 80, 90, 100)
+
+**要求:使用R语言编写函数,输入参数为数据集合 x,输出为以上指标的值。**
+
+
+
+
+## 控制流程
+
+
+### if-else 语句
+
+```{r}
+#| echo: true
+x <- 10
+
+if (x > 10) {
+ print("x 大于 10")
+} else {
+ print("x 不大于 10")
+}
+```
+
+## 控制流程
+
+
+### for 循环
+
+```{r}
+#| echo: true
+for (i in 1:5) {
+ print(i)
+}
+```
+
+
+## 自定义函数
+
+### 定义函数
+
+使用 `function` 关键字定义函数,并使用 `return` 关键字返回结果。
+
+```{r}
+#| echo: true
+my_function <- function(x, y) {
+ return(x + y)
+}
+```
+
+### 调用函数
+
+```{r}
+#| echo: true
+result <- my_function(3, 4)
+print(result)
+```
+
+## 数据结构
+
+### 向量
+
+向量是一维数组,可以包含相同类型的元素。
+
+```{r}
+#| echo: true
+(v <- c(1, 2, 3, 4, 5))
+```
+
+### 列表
+
+列表可以包含不同类型的元素。
+
+```{r}
+#| echo: true
+(l <- list(a = 1, b = "hello", c = TRUE))
+```
+
+## 数值型向量
+
+### 什么是数值型向量?
+
+- 在 R 中,向量是一种基本的数据结构。
+- 数值型向量包含相同类型的数值元素。
+
+
+### 创建数值型向量
+
+
+```{r}
+#| echo: true
+# 使用 c() 函数创建数值型向量
+(numeric_vector <- c(1, 2, 3, 4, 5))
+```
+
+## 数值型向量
+
+### 向量运算
+
+
+```{r}
+#| echo: true
+# 创建两个数值型向量
+(vector1 <- c(1, 2, 3))
+(vector2 <- c(4, 5, 6))
+
+# 执行向量加法
+(result <- vector1 + vector2)
+# 执行向量乘法
+(result <- vector1 * vector2)
+```
+
+## 向量运算
+
+### 向量求和
+
+```{r}
+#| echo: true
+# 创建数值型向量
+vector <- c(1, 2, 3, 4, 5)
+
+# 求和
+(sum_result <- sum(vector))
+```
+
+## 向量运算
+
+### 向量平均值
+
+```{r}
+#| echo: true
+# 创建数值型向量
+vector <- c(1, 2, 3, 4, 5)
+
+# 平均值
+(mean_result <- mean(vector))
+```
+
+## 运算-数值运算
+
+- a 的平方。
+- b 的立方。
+- a 除以 b 的商和余数。
+
+**要求:使用R语言编写函数,输入参数为 a 和 b,输出为上述结果。**
+
+## 运算-逻辑运算
+
+```{r}
+all(c(FALSE, 2, 1:3, 3) > 1)
+any(c(FALSE, 2, 1:3, 3) > 1)
+(flag1 <- FALSE)
+(flag2 <- (3 > 2))
+(flag3 <- TRUE * TRUE)
+(flag4 <- TRUE * FALSE)
+(flag5 <- TRUE & FALSE)
+(flag6 <- TRUE | FALSE)
+```
+
+
+## 运算-逻辑运算
+
+- `which`
+
+```{r}
+which(c(FALSE, TRUE, TRUE, FALSE, NA))
+which((11:15) > 12)
+
+```
+
+- `identical`
+
+```{r}
+identical(c(1,2,3), c(1,2,NA))
+identical(c(1L,2L,3L), c(1,2,3))
+```
+
+## 运算-字符型
+
+- 特殊字符
+
+```{r}
+c("abc", "", 'a cat', NA, '李明', "\n")
+```
+
+- `paste`
+
+```{r}
+(users <- paste("ruser", 1:9))
+paste(users, collapse = ", ")
+```
+
+
+## 运算-字符型
+
+- 大小写
+
+```{r}
+letters[1:5]
+toupper(letters[6:9])
+tolower(month.abb)
+stringr::str_to_title(c("monday", "tuesday"))
+
+```
+
+
+## 运算-字符型
+
+- 字符串截取
+
+```{r}
+substr("Monday", 1, 3)
+stringr::str_sub("Monday", 1, 3)
+```
+
+## 运算-字符型
+
+- 类型转换
+
+```{r}
+100
+as.character(100)
+
+as.numeric(c("0100", "0101"))
+
+sprintf('renamedfile%03d.png', c(3, 99, 100))
+```
+
+
+## 运算-字符型
+
+- 字符串替换
+
+```{r}
+(mystr <- "He was wrong!")
+gsub("wrong", "right", mystr)
+
+```
+
+
+
+## 索引
+
+### 向量
+
+```{r}
+# 创建一个向量
+vector <- c("apple", "banana", "cherry", "date")
+# 访问第三个元素
+vector[3]
+# 访问多个元素
+vector[c(2, 4)]
+vector[c(2:4)]
+```
+
+## 索引
+
+### 向量
+
+```{r}
+# 除了第2个元素
+vector[-2]
+# 超界
+vector[100]
+# 更新数据
+vector[7] <- "New Data"
+vector
+```
+
+## 索引
+
+```{r}
+
+
+(x <- 1:10)
+x[x > 6]
+
+x[x < 3] <- 99
+x
+# which
+which(x > 10)
+which.max(x)
+which.min(x)
+
+```
+
+## 索引
+
+### 列表
+
+```{r}
+
+
+# 创建一个列表
+my_list <- list(fruit = c("apple", "banana", "cherry"),
+ numbers = c(1, 2, 3, 4, 5))
+
+# 访问列表中的第二个元素
+my_list[[2]]
+
+```
+
+## 索引
+
+### 数据框
+
+```{r}
+
+# 创建一个数据框
+df <- data.frame(fruit = c("apple", "banana", "cherry"),
+ quantity = c(5, 7, 3))
+
+# 访问数据框中的第一个元素
+df[1, 1]
+# 第2-3行
+df[2:3, ]
+
+```
+
+## 日期和时间
+
+### `base` package
+
+
+```{r}
+as.Date("2024-01-01")
+as.POSIXct(1)
+as.Date(c("12/6/2022", "1/1/2023"), format="%m/%d/%Y")
+```
+
+
+## 日期和时间
+
+### `lubridate` package
+
+
+```{r}
+lubridate::today()
+
+require(lubridate)
+now()
+ymd(c(20200321, 240404, "20181231"))
+mdy(c("3-10-1998", "01-17-2018", "Feb 3, 2024"))
+ymd_hms("1998-03-16 13:15:45", tz = "Asia/Shanghai")
+```
+
+
+## 日期和时间
+
+### `lubridate` package
+
+```{r}
+make_date(2028, 1, 30)
+as_date("2000-01-01")
+as_datetime("2000-01-01", tz = "Asia/Shanghai")
+as_datetime("2024-02-01 8:00:00", tz = "Asia/Shanghai")
+```
+
+## 日期和时间
+
+### `lubridate` package
+
+```{r}
+
+year(today())
+wday(today())
+hour(now())
+```
+
+
+## 日期和时间
+
+### `lubridate` package
+
+
+```{r}
+(x <- now())
+floor_date(x, unit = "day")
+floor_date(x, unit = "hour")
+floor_date(x, unit = "10 minutes")
+ceiling_date(x, unit = "10 minutes")
+
+```
+
+## 因子(factor)
+
+### Factor是什么?
+
+- 在R中,Factor是用来表示分类数据的特殊数据类型。
+- 它将数据分成不同的水平(levels),每个水平代表了一个类别。
+
+
+## 因子(factor)
+
+### 创建Factor
+
+```{r}
+# 创建一个Factor
+gender <- factor(c("Male", "Female", "Female", "Male"))
+# 查看Factor的水平
+levels(gender)
+# 改变Factor的水平顺序
+gender <- factor(gender, levels = c("Female", "Male"))
+summary(gender) # 使用Factor进行分组
+as.numeric(gender) # 因子转换为纯粹的整数值
+as.character(gender) # 转为字符
+
+```
+
+
+## 因子(factor)
+
+### Label of Factor
+
+```{r}
+(x <- factor(1:12, label = month.abb))
+factor(x, levels = month.abb[c(2:12, 1)])
+```
+
+### 分组
+
+```{r}
+cut(1:20, breaks=c(0, 5, 10, 15, 18, 20))
+```
+
+
+## 矩阵
+
+```{r}
+1:20
+(A <- matrix(1:20, nrow = 4, byrow = TRUE))
+(B <- matrix(1:20, nrow = 4, byrow = FALSE))
+nrow(A)
+ncol(B)
+```
+
+## 矩阵
+### 高维矩阵
+
+```{r}
+X <- array(1:12, dim = c(3, 2, 2))
+dim(C)
+X[1, , ]
+X[1, , 1]
+
+```
+
+## 矩阵
+
+### `cbind`、`rbind`
+
+```{r}
+cbind(X[1, , ], X[2, , ], X[3, , ])
+rbind(X[1, , ], X[2, , ], X[3, , ])
+
+cbind(c(1,2), c(3,4), c(5,6))
+```
+
+## 数据框(data frame)
+
+**最主要的数据形式。**
+
+```{r}
+# 创建数据框
+(df <- data.frame(
+ Name = c("Alice", "Bob", "Charlie"),
+ Age = c(25, 30, 35),
+ Married = c(TRUE, FALSE, TRUE)
+))
+names(df)
+colnames(df)
+ncol(df); nrow(df)
+```
+
+
+## 数据框(data frame)
+
+```{r}
+df[1, 1]
+df[2, ]
+df[, 1]
+df$Age
+df[["Age"]]
+df[, "Age"]
+```
+
+## 数据框(data frame)
+
+```{r}
+X <- matrix(1:9, nrow = 3)
+class(X)
+(Y <- as.data.frame(X))
+names(Y)
+names(Y) <- c("colA", "colB", "colC")
+
+```
+
+
+
+
+## 欢迎讨论!{.center}
+
+
+`r rmdify::slideend(wechat = FALSE, type = "public", tel = FALSE, thislink = "https://drwater.rcees.ac.cn/course/public/RWEP/@PUB/SD/")`
diff --git a/SD/20240321_3_Excel基础/_extensions b/SD/20240321_3_Excel基础/_extensions
new file mode 120000
index 0000000..74119e3
--- /dev/null
+++ b/SD/20240321_3_Excel基础/_extensions
@@ -0,0 +1 @@
+../../_extensions
\ No newline at end of file
diff --git a/SD/20240321_3_Excel基础/index.qmd b/SD/20240321_3_Excel基础/index.qmd
new file mode 100644
index 0000000..c288aad
--- /dev/null
+++ b/SD/20240321_3_Excel基础/index.qmd
@@ -0,0 +1,127 @@
+---
+title: "三、Excel基础"
+subtitle: 《区域水环境污染数据分析实践》
Data analysis practice of regional water environment pollution
+author: 苏命、王为东
中国科学院大学资源与环境学院
中国科学院生态环境研究中心
+date: today
+lang: zh
+format:
+ revealjs:
+ theme: dark
+ slide-number: true
+ chalkboard:
+ buttons: true
+ preview-links: auto
+ lang: zh
+ toc: true
+ toc-depth: 1
+ toc-title: 大纲
+ logo: ./_extensions/inst/img/ucaslogo.png
+ css: ./_extensions/inst/css/revealjs.css
+ pointer:
+ key: "p"
+ color: "#32cd32"
+ pointerSize: 18
+revealjs-plugins:
+ - pointer
+filters:
+ - d2
+---
+
+```{r}
+#| include: false
+#| cache: false
+lang <- "cn"
+require(tidyverse)
+require(learnr)
+```
+
+## Tidy data
+
+由Hadley Wickham提出,tidy data 是一种结构化数据的组织方式,使得数据分析和可视化等操作更加简单、直观和有效。它有助于减少数据的混乱和复杂性,并促进数据的整洁性和易用性。
+
+- 每个变量一列
+- 每个观察一行
+- 每个表单一个表
+
+## Excel主要学习内容
+
+- 常用函数
+- 数据筛选/排序
+- 条件格式化
+- 数据透视表/图
+
+## 常用函数
+
+### 引用位置
+
+- 相对引用
+ - 相对引用是默认的引用类型。
+ - 当公式被复制到其他单元格时,引用的单元格会相对移动。
+
+```
+=A1 # 在 B1 单元格中的公式,引用了 A1 单元格的值
+=B1+C1 # 在 D1 单元格中的公式,引用了 B1 和 C1 单元格的值
+```
+
+### 绝对引用
+
+- 绝对引用固定了单元格的地址,不会随公式的复制而改变。
+
+```
+=$A$1 # 在 B1 单元格中的公式,始终引用 A1 单元格的值
+```
+
+
+## 常用函数
+
+- SUM:求和
+- AVERAGE:求平均值
+- MAX:求最大值
+- MIN:求最小值
+
+
+## 常用函数
+
+- COUNT:计数非空单元格
+- COUNTA:计数非空单元格(包括文本)
+- COUNTIF:根据条件计数
+- SUMIF:根据条件求和
+- AVERAGEIF:根据条件求平均值
+
+
+## 常用函数
+
+- VLOOKUP:垂直查找
+- HLOOKUP:水平查找
+- INDEX:返回指定位置的值
+- MATCH:查找值在区域中的位置
+- IF:条件判断函数
+
+
+## 常用函数
+
+- CONCATENATE:连接多个文本字符串
+- LEFT:提取文本左边的字符
+- RIGHT:提取文本右边的字符
+- MID:提取文本中间的字符
+- TEXT:将数值格式化为文本
+
+
+## 常用函数
+
+- ROUND:四舍五入到指定位数
+- ROUNDUP:向上取整
+- ROUNDDOWN:向下取整
+
+
+## 常用函数
+
+- TODAY:返回当前日期
+- NOW:返回当前日期和时间
+- DATE:返回指定年、月、日的日期
+- TIME:返回指定小时、分钟、秒的时间
+
+## 欢迎讨论!{.center}
+
+
+`r rmdify::slideend(wechat = FALSE, type = "public", tel = FALSE, thislink = "https://drwater.rcees.ac.cn/course/public/RWEP/@PUB/SD/")`
diff --git a/SD/20240321_9_课后作业/_extensions b/SD/20240321_9_课后作业/_extensions
new file mode 120000
index 0000000..74119e3
--- /dev/null
+++ b/SD/20240321_9_课后作业/_extensions
@@ -0,0 +1 @@
+../../_extensions
\ No newline at end of file
diff --git a/SD/20240321_9_课后作业/index.qmd b/SD/20240321_9_课后作业/index.qmd
new file mode 100644
index 0000000..0114e1a
--- /dev/null
+++ b/SD/20240321_9_课后作业/index.qmd
@@ -0,0 +1,83 @@
+---
+title: "课后作业6"
+subtitle: 《区域水环境污染数据分析实践》
Data analysis practice of regional water environment pollution
+author: 苏命、王为东
中国科学院大学资源与环境学院
中国科学院生态环境研究中心
+date: today
+lang: zh
+format:
+ revealjs:
+ theme: dark
+ slide-number: true
+ chalkboard:
+ buttons: true
+ preview-links: auto
+ lang: zh
+ toc: true
+ toc-depth: 1
+ toc-title: 大纲
+ logo: ./_extensions/inst/img/ucaslogo.png
+ css: ./_extensions/inst/css/revealjs.css
+ pointer:
+ key: "p"
+ color: "#32cd32"
+ pointerSize: 18
+revealjs-plugins:
+ - pointer
+filters:
+ - d2
+---
+
+```{r}
+#| include: false
+#| cache: false
+lang <- "cn"
+require(tidyverse)
+require(learnr)
+```
+
+## [第6次课后作业](第6次课后作业_模板.html)
+
+1. 如何在 R 中将数字 10 赋值给变量 x?
+2. 在 R 中,如何创建一个包含数字 1 到 5 的向量?
+3. 编写一个条件语句,如果变量 age 大于等于 18,则打印 "成年人",否则打印 "未成年人"。
+4. 使用 for 循环打印从 1 到 10 的整数。
+5. 编写一个名为 addition 的函数,接受两个参数 a 和 b,返回它们的和。
+6. 创建一个列表,包含三个元素:一个数字向量、一个字符向量和一个逻辑向量。
+7. 使用 read.csv() 函数读取名为 data.csv 的 CSV 文件,并将数据存储在一个名为 data 的数据框中。
+8. 从数据框中选择前五行,并将结果存储在一个新的数据框中。
+9. 将字符串 "hello world" 转换为大写。
+10. 从数据框中选择 score 列大于等于 90 的行。
+
+## **data.csv**内容
+
+```
+name,age,score
+Alice,25,85
+Bob,30,92
+Charlie,28,89
+David,22,95
+Eva,35,87
+Frank,27,91
+Grace,29,88
+Helen,26,93
+Ivan,31,86
+Jack,24,94
+Kelly,32,89
+Lily,28,90
+Mike,33,85
+Nancy,27,92
+Olivia,34,88
+Peter,29,93
+Queen,25,89
+Ryan,30,94
+Samantha,26,91
+Tom,31,87
+
+```
+
+
+## 欢迎讨论!{.center}
+
+
+`r rmdify::slideend(wechat = FALSE, type = "public", tel = FALSE, thislink = "https://drwater.rcees.ac.cn/course/public/RWEP/@PUB/SD/")`
+
diff --git a/SD/20240321_9_课后作业/第6次课后作业_模板.qmd b/SD/20240321_9_课后作业/第6次课后作业_模板.qmd
new file mode 100644
index 0000000..fa85bac
--- /dev/null
+++ b/SD/20240321_9_课后作业/第6次课后作业_模板.qmd
@@ -0,0 +1,42 @@
+---
+title: 课后作业6
+author: 姓名
+format: html
+---
+
+
+# 示例问题,在R中输出`1+2+3+...+100`的结果
+
+采用`for`循环完成,代码如下:
+
+```{r}
+total <- 0
+for (i in 1:100) {
+ total <- total + i
+}
+total
+```
+
+
+# 如何在 R 中将数字 10 赋值给变量 x?
+
+
+# 在 R 中,如何创建一个包含数字 1 到 5 的向量?
+
+# 编写一个条件语句,如果变量 age 大于等于 18,则打印 "成年人",否则打印 "未成年人"。
+
+# 使用 for 循环打印从 1 到 10 的整数。
+
+# 编写一个名为 addition 的函数,接受两个参数 a 和 b,返回它们的和。
+
+# 创建一个列表,包含三个元素:一个数字向量、一个字符向量和一个逻辑向量。
+
+# 使用 read.csv() 函数读取名为 data.csv 的 CSV 文件,并将数据存储在一个名为 data 的数据框中。
+
+# 从数据框中选择前五行,并将结果存储在一个新的数据框中。
+
+# 将字符串 "hello world" 转换为大写。
+
+# 从数据框中选择 score 列大于等于 90 的行。
+
+
diff --git a/SD/index.qmd b/SD/index.qmd
new file mode 100644
index 0000000..f2a4ff9
--- /dev/null
+++ b/SD/index.qmd
@@ -0,0 +1,32 @@
+---
+subtitle: "课件"
+---
+
+```{r}
+#| include: false
+require(drwateR)
+require(rmdify)
+rmdify::rmd_init()
+knitr::opts_chunk$set(echo = TRUE)
+```
+
+```{r}
+#| output: asis
+#| echo: false
+#| message: false
+
+data.frame(fd = dir(".", pattern = "[-_]")) |>
+ dplyr::filter(!grepl("_files", fd)) |>
+ dplyr::mutate(fn = purrr::map_chr(fd, ~ file.path(.x, dir(.x,
+ pattern = "index.qmd|index.html"))[1])) |>
+ dplyr::transmute(htmlstr = purrr::map2_chr(fn, fd, ~ paste0("## [", .y, "](", .x, ")\n\n",
+ ifelse(!grepl("qmd$", .x), "",
+ paste0("\n\n"))))) |>
+ dplyr::pull(htmlstr) |>
+ paste(collapse = "") |>
+ cat()
+```