RWEP/SD/20240321_2_R语言语法基础/index.qmd

796 lines
12 KiB
Plaintext
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

---
title: "二、R语言语法基础"
subtitle: 《区域水环境污染数据分析实践》<br>Data analysis practice of regional water environment pollution
author: 苏命、王为东<br>中国科学院大学资源与环境学院<br>中国科学院生态环境研究中心
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/")`