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() +```