R 语言适合做什么

R 是一门为统计计算和数据分析而生的语言。它的核心优势不在于通用软件开发,而在于“把数据变成结论”的整条链路:从读入、清洗、统计建模到可视化出图,R 都有成熟且一致的生态。尤其是一次性分析、科研统计、报告图表,R 的代码量往往只有通用语言的几分之一。

理解 R 有一个关键的心理转换:它天生面向向量。多数函数不是作用在一个数上,而是直接作用在一整列数据上;你写 mean(x) 时,x 可以是成千上万个数的向量。这个“向量化”思想,是 R 代码简洁的根本原因,也是初学者最先要适应的点。

别把 R 当成“另一种 Python”。它的定位是数据分析工作台:一条管道从原始数据接到图表,中间几乎没有胶水代码——这才是它最舒服的使用方式。
本文核心知识点
  • 向量化运算默认作用于整列数据,避免显式循环。
  • 数据框data.frame / tibble 是分析的核心数据结构。
  • dplyr 管道用 %>% 把筛选、分组、汇总串成一条链。
  • ggplot2图层语法:数据 + 映射 + 几何对象层层叠加。
R 语言数据分析示意:散点汇聚成上升折线、柱状方块与圆环组成的抽象图表群,数据流从管道注入
从数据到图表:R 把统计计算与可视化放进同一个工作流,中间的每一步都可复用、可复现。

环境准备与基本数据类型

最省心的入门方式是安装 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,加分组映射即可——这就是图形语法的复用性。