R 语言适合做什么
R 是一门为统计计算和数据分析而生的语言。它的核心优势不在于通用软件开发,而在于“把数据变成结论”的整条链路:从读入、清洗、统计建模到可视化出图,R 都有成熟且一致的生态。尤其是一次性分析、科研统计、报告图表,R 的代码量往往只有通用语言的几分之一。
理解 R 有一个关键的心理转换:它天生面向向量。多数函数不是作用在一个数上,而是直接作用在一整列数据上;你写 mean(x) 时,x 可以是成千上万个数的向量。这个“向量化”思想,是 R 代码简洁的根本原因,也是初学者最先要适应的点。
别把 R 当成“另一种 Python”。它的定位是数据分析工作台:一条管道从原始数据接到图表,中间几乎没有胶水代码——这才是它最舒服的使用方式。
- 向量化运算默认作用于整列数据,避免显式循环。
- 数据框data.frame / tibble 是分析的核心数据结构。
- dplyr 管道用 %>% 把筛选、分组、汇总串成一条链。
- ggplot2图层语法:数据 + 映射 + 几何对象层层叠加。
环境准备与基本数据类型
最省心的入门方式是安装 R 之后,直接在 RStudio 里操作:左边写脚本、下方是控制台、右侧看变量与图表。日常分析建议直接安装 tidyverse 元包,它一次带来 dplyr、ggplot2、readr、tidyr 等一整套工具。
# 安装常用工具包(只需一次)
install.packages("tidyverse")
# 每次分析开始时加载
library(dplyr)
library(ggplot2)
# 基本类型:数值、字符、逻辑
n <- 3.14 # numeric
s <- "hello" # character
ok <- TRUE # logical
class(n) # "numeric"
class(s) # "character"
赋值用 <-(也可用 =,但社区约定赋值用箭头,函数传参用等号,便于区分)。R 是动态类型语言,变量类型在赋值时确定,可用 class() 查看。它的下标从 1 开始,这是与 C/C++/Python 最直观的差别之一。
向量、因子与数据框
向量是最基本的容器,用 c() 创建,且同一向量内元素类型一致(混合时会被自动强制转换)。因子(factor)用来表示分类变量,数据框(data.frame / tibble)则是“能装多种类型列”的表格——数据分析里绝大多数操作都围绕它展开。
# 向量与向量化运算
x <- c(3, 5, 8, 13)
x * 2 # 6 10 16 26,整列同时运算
sum(x) / length(x) # 7.25
# 数据框:每列可以是不同类型
df <- data.frame(
name = c("A", "B", "C"),
age = c(20, 31, 25),
city = factor(c("北京", "上海", "北京"))
)
str(df) # 查看结构:3 obs. of 3 variables
df$age # 用 $ 取列
df[df$age > 24, ] # 逻辑索引筛选行
三个常见坑:c(1, "a") 会把数字 1 也变成字符 "1";筛选条件用 &、| 而不是 &&、||(后者只用于单个逻辑值);取列时 df[, "age"] 默认可能返回向量而非数据框,需要保留表格结构时可加参数 drop = FALSE。
dplyr:用管道组织数据处理
dplyr 把数据操作归纳成几个“动词”,再用管道 %>% 把它们串起来。管道的语义是“把左边的结果作为右边函数的第一个参数”,于是嵌套函数变成了一条从上往下的流水线,可读性大幅提升。
| 动词 | 作用 | 示例 |
|---|---|---|
| filter() | 按条件筛选行 | filter(age >= 18) |
| select() | 挑选列 | select(name, age) |
| mutate() | 新增/修改列 | mutate(bmi = w / h^2) |
| arrange() | 排序 | arrange(desc(age)) |
| group_by() | 分组 | group_by(city) |
| summarise() | 汇总 | summarise(n = n()) |
df %>%
filter(age >= 21) %>%
mutate(age_next = age + 1) %>%
arrange(desc(age)) %>%
select(name, age, age_next)
把这条链读成一句话:“取 age 不小于 21 的行,加一列 next 年龄,按年龄降序排列,只保留三列。”用嵌套写法表达同样逻辑会层层内缩,难以维护。管道让每一步都能单独检查,这正是它被称为“数据处理语法”的原因。
描述统计与分组聚合
拿到数据的第一步通常是描述统计:均值、中位数、标准差、分位数。R 内置函数直接可用,配合 summary() 能一次看到多个指标。真正体现威力的是“分组聚合”——同一套汇总动作,按类别分别计算。
set.seed(1)
sales <- data.frame(
region = rep(c("华东", "华北", "华南"), each = 4),
month = rep(1:4, times = 3),
amount = round(runif(12, 100, 500))
)
# 每组的销售总额与平均单笔
sales %>%
group_by(region) %>%
summarise(
total = sum(amount),
avg = mean(amount),
n = n(),
.groups = "drop"
)
用 summarise 时记住两点:n() 是当前组的行数,常用来计数;分组后如果不显式 ungroup()(或用 .groups = "drop"),分组信息会保留到后续操作,稍不注意就会得到意料之外的结果。
ggplot2:图层语法画图
ggplot2 的核心是“图形语法”:一张图由数据、映射(aes)和几何对象(geom)叠加而成,你想加一层就用 +。这种思路让“改配色、换坐标、加标注”都变成追加一行的操作,而不是换一个绘图函数。
library(ggplot2)
# 按地区汇总后画柱状图
agg <- sales %>%
group_by(region) %>%
summarise(total = sum(amount), .groups = "drop")
ggplot(agg, aes(x = region, y = total, fill = region)) +
geom_col(width = 0.6) +
geom_text(aes(label = total), vjust = -0.5) +
labs(title = "各地区销售总额", x = "地区", y = "金额") +
theme_minimal()
读法:ggplot(data, aes(...)) 声明数据与映射,geom_col 决定“用柱子表示”,geom_text 再叠一层数值标注,labs 补标题与轴标签,theme_minimal 换一套清爽主题。想画折线就把 geom_col 换成 geom_line,加分组映射即可——这就是图形语法的复用性。
实战:一份销售数据的分析与作图
把读入、清洗、聚合、可视化串成一条完整链路,模拟从原始销售明细到一张可用图表的过程。这里用 read_csv 读文件(示例用内存数据代替),再依次处理。
library(dplyr)
library(ggplot2)
set.seed(42)
raw <- data.frame(
order_id = 1:60,
region = sample(c("华东", "华北", "华南", "西南"), 60, TRUE),
amount = round(runif(60, 50, 800)),
refunded = sample(c(TRUE, FALSE), 60, TRUE, prob = c(0.1, 0.9))
)
clean <- raw %>%
filter(!refunded) %>% # 去掉退款单
mutate(bucket = cut(amount, breaks = c(0, 200, 500, Inf),
labels = c("小额", "中额", "大额")))
by_bucket <- clean %>%
count(region, bucket) %>% # 分组计数
tidyr::complete(region, bucket, fill = list(n = 0))
ggplot(by_bucket, aes(x = region, y = n, fill = bucket)) +
geom_col(position = "dodge") +
labs(title = "各区域订单金额分布", x = "区域", y = "订单数", fill = "金额档") +
theme_minimal()
print(clean %>% summarise(orders = n(), revenue = sum(amount)))
这段代码示范了真实分析的典型动作:先过滤脏数据(退款单)、再造派生列(金额分档)、再分组计数、最后分组画堆叠/并列柱状图。每一步之间都用管道衔接,谁读起来都能顺着往下走;把它保存成 .R 脚本,换一份数据即可复现整套分析。
学习路径与常见问题
建议的学习顺序:先掌握向量与数据框的基本操作,再学 dplyr 的核心动词,随后进入 ggplot2 的图形语法,最后补上读文件(readr)、整洁数据(tidyr)和一份可复现的报告(R Markdown / Quarto)。这条路径的每一步都能立即产出可见结果,正反馈很强。
- 报错别慌:R 的报错会明确指出“哪个函数、第几行、对象不存在还是参数不对”,逐句读通常就能定位。
- 下标从 1 开始,且用
[]索引;负索引表示“排除”而不是“从末尾数”。 - 优先向量化,能用
ifelse()或整列运算就别写for循环。 - 注意 NA:多数统计函数默认遇到缺失值返回 NA,记得加
na.rm = TRUE。 - 保存会话:用脚本而不是只在控制台敲命令,分析才能复现。
R 的价值不是“学会一门语言”,而是拥有一套可复现的数据分析工作流:同样的脚本,换一份数据,还能得出正确的结论。
下一篇我们转向 MATLAB,看它如何用矩阵语言和仿真工具,服务工程与科学计算场景。