R语言学习笔记

基本语法

使用包

安装包

1
install.packages("tidyr")

:: 访问某个包中的函数或变量,从而 无需将整个包加载到全局环境中。

1
tidyr::billboard

与之相对的是library()

1
library(tidyr)

赋值语句

<- =

  • 在函数定义中设置默认参数时,通常使用=
  • 在函数调用时,使用=可以更明确地指定参数名

只用在 函数调用/定义 中 指定参数名/设置默认参数 时,使用=
其它情况推荐使用<-

一般的赋值语句,<-更符合R的语法风格


数据结构


data.table

ggplot2


R图表中显示数据类型
<dbl> double类型
<chr> 字符串类型


4.18

tidy

“整洁的数据集都是相似的;混乱的数据集各有各的混乱。”

tidy data

整洁的数据集需要简单地满足以下两个要素:
(1) 每列是一个变量(Variables go in columns)
(2) 每行是一个观测(Observation go in rows)

怎么理解这两个要素呢?
数据集中,每一列应该表示一个变量(属性或特征)。变量是描述数据的某一方面的内容,例如年龄、性别、收入等。
数据集中,每一行应该表示一个观测值(记录或实例)。观测是数据的一个完整单元,例如某个人、某个时间点的测量值等。

dcast()

用法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
dcast(

data, # 数据框对象

formula, # LHS ~ RHS 控制宽格式的列 描述如何将数据分组和重塑的公式

fun.aggregate, # 变换宽格式的函数

value.var, # 需要填充值到变换后区域的列

sep, # 生成新列名时用于连接的分隔符

fill, # 在宽格式中填充的默认值

drop # 是否保留缺失的组合

)

文件转换

rmd 转 pdf html word

  1. 代码

    1
    2
    3
    rmarkdown::render("your_file.rmd", output_format = "pdf_document")
    rmarkdown::render("your_file.rmd", output_format = "html_document")
    rmarkdown::render("your_file.rmd", output_format = "word_document")
  2. 在YAML头部指定输出格式

    1
    2
    3
    ---



R Markdown文件结构

YAML头部

在rmd文件中,YAML头部位于文件的开头部分,用于指定文档的元信息和输出格式。以三条短横线(---)开始和结束:

1
2
3
4
5
6
7
8
---
title: "Document Title"
author: "yvyvSunlight"
date: "`r Sys.Date()`"
output:
html_document: default
pdf_document: default
---

常用预处理代码

setup, include
1
2
3
knitr::opts_chunk$set(echo=T,message=F,warning=F,error=T)
library(data.table)
library(ggplot2)

空格与缩进

在代码编辑过程中,有人推荐使用空格而非缩进,
原因是有的语言语法规范是缩进2字节、而有的语言语法规范是缩进4字节
而代码编辑器的缩进值一般是一个固定值(常常是4字节)

所以有人推荐用空格自由控制缩进字节数

我们经常遇到:
代码编辑器 缩进4字节 — 语法规范 缩进4字节
十分顺手

而R语言 它的语法规范就是缩进2字节的
(虽然缩进4字节也能正常运行)


merge函数

字符串操作

字符串拼接

1
paste(..., sep = " ", collapse = ", ")
1
paste0(...)

简化版paste

字符串分割

1
tstrsplit(x, split, type.convert = FALSE, fixed = FALSE, perl = FALSE, ...)

x: 要拆分的字符串向量或数据表中的列
split: 分隔符,可以是字符串或正则表达式
type.convert: 逻辑值,是否自动将结果转为适当的数据类型(如数值型)。默认为FALSE
fixed:逻辑值,是否自动将


R语言老师云:
机器学习、深度学习不难,往往是现成的。
难得是数据的修正、检查、提高质量!!

Garbage in,garbage out!

poisine garbage

一定要做的是数据清洗!


10 11 12不考


课程复习

1&2. R intro

运算符

运算符 含义 例子
- 1 + 2
- 3 - 2
* 3 * 2
/ 9 / 3
^ 乘方 2 ^ 3
** 乘方 2 ** 3
%% 取余 9 %% 4
%/% 取整 9 %/% 4

3. Data Visualisation

4. Data transformation

5. data.table、io、Factor

6. data Reshaping

7. rational data

8. dates and time

9.strings

10. funciotns iteration

11. functional programming

12. Probability and Hypothesis Testing

假设和检验

data.table 是 R 语言中一个功能强大的包,用于高效地处理和分析数据。它提供了许多快速且简洁的数据操作方法。以下是 data.table 的一些常见操作示例:


1. 创建 data.table

r

复制

1
2
3
4
5
6
7
8
# 创建一个 data.table
library(data.table)
dt <- data.table(
id = 1:5,
name = c("Alice", "Bob", "Charlie", "David", "Eve"),
age = c(25, 30, 35, 40, 45),
salary = c(50000, 54000, 60000, 62000, 65000)
)

2. 子集操作:筛选行

r

复制

1
2
# 筛选年龄大于 30 的行
dt[age > 30]

3. 子集操作:选择列

r

复制

1
2
# 选择特定列
dt[, .(name, salary)]

4. 排序

r

复制

1
2
3
4
5
# 按年龄升序排序
dt[order(age)]

# 按工资降序排序
dt[order(-salary)]

5. 分组和聚合

r

复制

1
2
3
4
5
# 按年龄分组,计算每组的平均工资
dt[, .(avg_salary = mean(salary)), by = age]

# 按多个列分组
dt[, .(avg_salary = mean(salary)), by = .(age, name)]

6. 更新和修改

r

复制

1
2
3
4
5
# 更新工资(增加 10%)
dt[, salary := salary * 1.1]

# 添加新列
dt[, bonus := salary * 0.1]

7. 删除行或列

r

复制

1
2
3
4
5
# 删除年龄大于 40 的行
dt <- dt[age <= 40]

# 删除列
dt[, age := NULL]

8. 连接操作

r

复制

1
2
3
4
5
6
7
8
9
10
11
# 创建另一个 data.table
dt2 <- data.table(
id = 3:7,
department = c("HR", "IT", "Finance", "Marketing", "Admin")
)

# 内连接
merged <- merge(dt, dt2, by = "id", all = FALSE)

# 左连接
merged <- merge(dt, dt2, by = "id", all.x = TRUE)

9. 使用 := 进行高效更新

r

复制

1
2
# 更新特定行的值
dt[id == 3, salary := 65000]

10. 多键操作

r

复制

1
2
3
4
5
# 设置多键
setkey(dt, id, name)

# 使用多键进行查询
dt[.(3, "Charlie")]

11. 使用 .SD 和 .BY

r

复制

1
2
3
4
5
# 使用 .SD 计算分组内的标准差
dt[, .(sd_salary = sd(.SD)), by = age, .SDcols = "salary"]

# 使用 .BY 获取分组信息
dt[, .(count = .N, group = .BY), by = age]

12. 条件操作

r

复制

1
2
# 条件赋值
dt[, bonus := fifelse(salary > 60000, salary * 0.2, salary * 0.1)]

13. 熔合和透视表

r

复制

1
2
3
4
5
# 熔合数据(类似 tidyr::gather)
melt(dt, id.vars = "id", measure.vars = c("age", "salary"))

# 透视表(类似 tidyr::spread)
dcast(dt, id ~ name, value.var = "salary")

14. 使用 on 进行连接

r

复制

1
2
# 按键连接
dt[dt2, on = "id", nomatch = 0L]

15. 使用 by = .EACHI 进行分组操作

r

复制

1
2
# 按组计算排名
dt[, rank := frank(-salary), by = age]

16. 使用 Reduce 和 Map 进行复杂操作

r

复制

1
2
3
4
5
# 使用 Reduce 计算累积和
dt[, cum_salary := Reduce(`+`, .SD, accumulate = TRUE), .SDcols = "salary"]

# 使用 Map 计算工资的平方
dt[, salary_squared := Map(`^`, .SD, 2), .SDcols = "salary"]

17. 使用 shift 进行滞后和领先计算

r

复制

1
2
# 计算工资的月度增长率
dt[, salary_growth := (salary - shift(salary)) / shift(salary), by = id]

18. 使用 unique 和 duplicated

r

复制

1
2
3
4
5
# 获取唯一行
unique(dt)

# 标记重复行
dt[, is_duplicate := duplicated(dt)]

19. 使用 rbindlist 合并多个 data.table

1
2
3
4
5
6
# 创建多个 data.table
dt1 <- data.table(a = 1:3, b = letters[1:3])
dt2 <- data.table(a = 4:6, b = letters[4:6])

# 合并
dt_combined <- rbindlist(list(dt1, dt2))

20. 使用 fwrite 和 fread 快速读写数据

1
2
3
4
5
# 写入文件
fwrite(dt, "data.csv")

# 读取文件
dt <- fread("data.csv")

这些操作展示了 data.table 的灵活性和高效性,使其成为处理大型数据集时的首选工具之一。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
# 加载必要的包
library(ggplot2)

# 创建示例数据集
data <- data.frame(
category = c("A", "B", "C", "D", "E"),
value = c(10, 15, 7, 5, 20)
)

# 基本绘图
p <- ggplot(data, aes(x = category, y = value)) +
geom_bar(stat = "identity") # 使用条形图

# 添加标题和标签
p <- p + labs(
title = "示例条形图",
x = "类别",
y = "值",
caption = "数据来源: 示例数据集"
)

# 添加主题自定义
p <- p + theme_minimal() +
theme(
plot.title = element_text(hjust = 0.5), # 标题居中
axis.text.x = element_text(angle = 45, hjust = 1), # X轴标签倾斜
legend.position = "bottom" # 图例位置
)

# 添加颜色和填充
p <- p + scale_fill_manual(values = c("blue", "red", "green", "purple", "orange")) +
scale_color_manual(values = c("blue", "red", "green", "purple", "orange"))

# 添加文本注释
p <- p + geom_text(aes(label = value), vjust = -0.5) # 在条形上方显示数值

# 显示绘图
print(p)

melt(

data, # 数据框对象

id.vars, # 需要保留的列名

measure.vars, # 需要被转换成长格式的列名

variable.name, # 长格式中,用于存储原列名的新列名

value.name, # 长格式中,用于存储原列值的新列名

variable.factor, # 长格式中,存储原列名的列是否因子化

variable.factor, # 长格式中,存储原列值的列是否因子化

na.rm # 是否删除NA值

)


R语言学习笔记
http://example.com/2025/04/18/R语言学习笔记/
作者
yvyvSunlight
发布于
2025年4月18日
许可协议