[1] 10.5
[1] "Alice"
大一/大二 R语言入门课程
上节课复习: 我们已经学会了如何打开 RStudio,以及如何像计算器一样使用 R。
这节课目标: 我们要深入 R 的“语法”核心。如果说上节课是学会了“说话”,这节课我们要学习“词性”(数据类型)和“逻辑”(True/False)。
今日大纲: 1. 对象 (Objects) 的种类 2. 如何判断和转换类型 3. 管理你的环境 (Remove & Class) 4. 基本数学与统计函数 5. 核心难点:布尔逻辑 (Boolean Logic) 6. R 的超能力:Packages (包) 7. RMarkdown/Quarto 写作规范
在 R 里面,所有的数据都被装在“盒子”里,这些盒子就是对象 (Objects)。最常见的有三种“材质”的盒子:
1, 3.14, -100"" 或 '' 包果。
"Hello", "R Language", "123" (注意:带引号的数字也是字符!)TRUE (真, T) 或 FALSE (假, F)is. 系列函数如果不确定一个盒子里装的是什么,我们可以用 is.xxx() 函数来询问 R。这就像问:“你是数字吗?”
R 会回答你 TRUE (是) 或 FALSE (不是)。
is.numeric(x): 是数值吗?
is.character(x): 是字符吗?
is.logical(x): 是逻辑值吗?
程式碼片段
#| label: check-types
obj1 <- "500" # 注意引号,这是字符
obj2 <- 500 # 这是数字
# 让我们来测试一下
is.numeric(obj1) # "500" 是数字吗? -> FALSE
is.numeric(obj2) # 500 是数字吗? -> TRUE
is.character(obj1) # "500" 是字符吗? -> TRUE
class)除了问 is.xxx,我们可以直接问 R:“它是什么类别?”,使用 class() 函数。
程式碼片段
class(100)
class("100")
class(TRUE)
rm)当你的 Environment (右上角) 乱七八糟时,你可以扔掉不需要的盒子。
rm(object_name): 删除特定对象。
rm(list = ls()): 核弹级指令 —— 删除环境里所有对象(慎用,但在脚本开头清空环境时很常用)。
程式碼片段
a <- 1
rm(a) # 变量 a 从此消失了
# print(a) # 如果运行这行会报错:object 'a' not found
as.)有时候我们需要把“文本格式的数字”强制变成“真正的数字”才能进行计算。这叫类型转换。
as.numeric(): 变成数字
as.character(): 变成字符
as.logical(): 变成逻辑值 (0变FALSE, 非0变TRUE)
注意:如果不小心把 “Hello” 强行转成数字,R 会给你一个
NA(Not Available,缺失值)。
程式碼片段
num_str <- "2024"
class(num_str) # 一开始是 character
# 变身!
real_num <- as.numeric(num_str)
class(real_num) # 现在是 numeric 了
print(real_num + 1) # 可以做加法了
R 是统计学家的最爱,因为它内置了极其强大的统计功能。
假设我们要分析一个班级的成绩:
scores <- c(85, 92, 78, 60, 95) (注: c() 是把数据打包成向量)
| 函数 | 含义 | 例子 | 结果 |
mean() |
平均值 | mean(scores) |
82 |
median() |
中位数 | median(scores) |
85 |
sd() |
标准差 | sd(scores) |
14.1 |
var() |
方差 | var(scores) |
199.5 |
min() / max() |
最小/大值 | min(scores) |
60 |
round() |
四舍五入 | round(3.14159, 2) |
3.14 |
quantile() |
百分位数 | quantile() |
0% 25% 50% 75% 100% |
程式碼片段
scores <- c(85, 92, 78, 60, 95)
avg <- mean(scores)
print(paste("平均分是:", avg))
length()length() 函数用来告诉我们一个对象里包含多少个元素。这在处理大型数据时非常重要,用来检查数据行数是否对得上。
程式碼片段
my_vec <- c(1, 2, 3, 4, 5)
length(my_vec)
# 即使是一个单独的数字,长度也是 1
length(100)
计算机的世界非黑即白。我们需要学会用逻辑符号来做判断。
== : 等于 (注意是两个等号!一个等号是赋值)
!= : 不等于
> / < : 大于 / 小于
& : AND (并且) - 两者都真才为真
| : OR (或者) - 只要有一个真就为真
! : NOT (非) - 真变假,假变真
假设我们需要写一个程序决定是否会淋湿 (get_wet)。
只有当:下雨了 (True) 并且 没带伞 (True) 时,你才会淋湿。
程式碼片段
is_raining <- TRUE # 外面在下雨
has_umbrella <- FALSE # 我没有带伞
# 逻辑判断:
# 下雨 AND (没有 伞)
will_get_wet <- is_raining & (!has_umbrella)
print(will_get_wet)
## 8. TRUE and FALSE (数值本质)
在 R 里面:
**TRUE** 等于 **1**
**FALSE** 等于 **0**
这意味着我们可以对它们做数学运算!
::: {.cell}
```{.r .cell-code}
# 模拟这一周的天气
rain <- c("Yes", "Yes", "Yes", "Yes", "Yes", "Yes", "No")
# 1. 看看内部结构 (Internal representation)
# 只要是 "Yes" 的地方就是 TRUE (1)
as.numeric(rain == "Yes")
[1] 1 1 1 1 1 1 0
[1] 6
:::
如果我们想知道具体是哪天,或者有没有下雨?
1. Which elements are TRUE? (哪几天?) 返回的是位置(下标)。
2. Are any elements TRUE? (有哪怕一天吗?) 只要有一个是 True,就返回 True。
3. Are all elements TRUE? (全都是吗?) 必须全是 True 才返回 True。
R 语言的设计哲学是“模块化” (Modularity)。
可以将 R 环境想象成一个图书馆 (Library):
| 动作 | 对应的 R 函数 | 现实类比 | 执行频率 |
|---|---|---|---|
| Installation | install.packages("pkg") |
购书:把书买回来放到书架上。 | 仅需一次 (Per Device) |
| Loading | library(pkg) |
借阅:把书从架子上取下来阅读。 | 每次 (Per Session) |
在学术界和工业界,tidyverse 是最主流的数据科学工具集。它不是一个单一的包,而是一个共享相同设计理念(Tidy Data)的包集合 (Meta-package)。
加载 library(tidyverse) 将自动激活以下核心组件:
ggplot2
dplyr & tidyr
filter, select, mutate, summarize。作为初学者,建议掌握以下核心库即可覆盖 90% 的课程需求:
| Package | Domain (领域) | Key Functionality (核心功能) |
|---|---|---|
tidyverse |
Data Science Core | 数据清洗、转换与可视化的全套工具 |
readxl |
Data Import | 读取 Excel 文件 (.xlsx, .xls) |
haven |
Import (Social Sci) | 读取 SPSS (.sav), Stata (.dta), SAS 数据 |
rmarkdown |
Reproducible Report | 生成 PDF/HTML 报告 (即本课件的引擎) |
%>%)tidyverse 是 R 数据科学最主流的包集合。它引入了“管道操作符” %>% (快捷键: Ctrl/Cmd + Shift + M)。
它的意思是:“把左边的东西,传递给右边”。
程式碼片段
# 不用管道
# round(mean(c(1, 2, 3)), 2) # 层层包裹,很难读
# 使用管道 (逻辑更像人类语言)
library(dplyr) # 需要先加载 dplyr 包
c(1, 2, 3) %>%
mean() %>%
round(2)
读作:拿数据 -> 算平均值 -> 保留两位小数。
你们现在看到的这个幻灯片,就是用 Quarto 写的!它是 RMarkdown 的升级版。
YAML Header (头部): 文档最上方 --- 包裹的部分。决定了文档是做成 PDF、网页还是 PPT。
Markdown Text (文本): 普通的文字说明。
# 一级标题,## 二级标题
**加粗**
Code Chunks (代码块):
用 ```{r} 开头,``` 结尾。
代码必须写在灰色块块里才能运行!
绿色小三角点击运行。
R 加载包时喜欢吐出红色提示,显得不专业,用这些关掉它:
warning: false (隐藏警告,如版本差异)
message: false (隐藏通知,如加载成功信息)
error: true (允许代码报错并继续生成文档,防止因一道题卡住交不了作业)
控制画图的大小和位置:
fig-width: 6 (宽,英寸)
fig-height: 4 (高,英寸)
fig-align: "center" (居中/left/right)
R
```
#| fig-width: 5 #| fig-align: “center” #| echo: false
plot(1:10, main = “居中的小图”)
今天我们完成了从“使用计算器”到“编写程序”的关键跨越。我们并没有处理复杂的数据,而是先打好了地基:
"100" 只是文本,100 才是数字。TRUE 和 FALSE 来做筛选和决策。library (特别是 tidyverse) 来武装自己。