R

统计计算专家 - 数据分析和可视化,ggplot2 和 Tidyverse 生态系统

TL;DR

一句话:R 是统计学家的语言——专为数据分析和可视化而生。

核心优势

  • 内置统计函数
  • 一流的可视化(ggplot2)
  • Tidyverse 现代数据处理
  • CRAN 上有 20,000+ 包

Philosophy

R 是由统计学家为统计学家设计的:

  • 向量优先 - 一切都是向量。操作默认向量化。
  • 交互式分析 - 为探索性数据分析设计,不是生产系统
  • 函数式风格 - 函数是一等公民,偏好不可变数据
  • 领域专用 - 不是通用语言,但在其领域很出色

R 优先考虑统计正确性和分析便利性,而非原始性能。

Quick Start

安装

# macOS
brew install r

# Linux (Ubuntu)
sudo apt install r-base

# Windows - 从 r-project.org 下载

验证(最新版:4.5.2)

R --version  # R version 4.5.2

第一个程序

创建 hello.R

print("Hello, World!")
Rscript hello.R

交互式 R

R
> 2 + 2
[1] 4
> mean(c(1, 2, 3, 4, 5))
[1] 3

RStudio(推荐 IDE)

posit.co 下载

Language Essentials

变量与类型

# 变量(用 <- 赋值)
name <- "Alice"
age <- 25
price <- 19.99
active <- TRUE

# 向量(基础数据结构)
numbers <- c(1, 2, 3, 4, 5)
names <- c("Alice", "Bob", "Carol")

# 数据框(表格)
df <- data.frame(
  name = c("Alice", "Bob"),
  age = c(25, 30)
)

控制流

# if-else
if (age >= 18) {
  print("成年人")
} else if (age >= 13) {
  print("青少年")
} else {
  print("儿童")
}

# ifelse(向量化)
status <- ifelse(age >= 18, "成年人", "未成年")

# for 循环
for (i in 1:5) {
  print(i)
}

# 但优先使用向量化操作!

函数

# 定义函数
greet <- function(name, greeting = "Hello") {
  paste(greeting, name, sep = ", ")
}

greet("Alice")           # "Hello, Alice"
greet("Bob", "Hi")       # "Hi, Bob"

# 匿名函数(R 4.1+)
add <- \(a, b) a + b
add(2, 3)  # 5

向量化操作

x <- c(1, 2, 3, 4, 5)
y <- c(10, 20, 30, 40, 50)

# 操作逐元素应用
x + y      # c(11, 22, 33, 44, 55)
x * 2      # c(2, 4, 6, 8, 10)
x > 3      # c(FALSE, FALSE, FALSE, TRUE, TRUE)

# 函数作用于向量
mean(x)    # 3
sum(x)     # 15
sqrt(x)    # c(1, 1.41, 1.73, 2, 2.24)

数据处理(Tidyverse)

library(dplyr)

# 管道运算符
df |>
  filter(age > 25) |>
  select(name, age) |>
  arrange(desc(age))

# 现代 tidyverse 风格
df |>
  mutate(age_group = ifelse(age >= 30, "资深", "初级")) |>
  group_by(age_group) |>
  summarize(count = n(), avg_age = mean(age))

Gotchas

向量索引从 1 开始

x <- c(10, 20, 30)
x[1]    # 10(不是 0!)
x[2:3]  # c(20, 30)
x[-1]   # c(20, 30) - 负数表示排除

<- vs = 赋值

x <- 10  # 首选,总是有效
x = 10   # 也可以,但 <- 更地道

# 函数调用中的重要区别
mean(x = c(1,2,3))  # x 是参数
mean(x <- c(1,2,3)) # x 被赋值并传递

NA 处理

x <- c(1, 2, NA, 4)

mean(x)               # NA(NA 会传播!)
mean(x, na.rm = TRUE) # 2.333...

is.na(x)              # c(FALSE, FALSE, TRUE, FALSE)
na.omit(x)            # c(1, 2, 4)

Factor 陷阱

f <- factor(c("a", "b", "a"))
levels(f)     # c("a", "b")

# 转换时小心
as.numeric(factor(c("3", "1", "2")))  # c(2, 1, 3) - 不是 c(3, 1, 2)!

# 正确方式
as.numeric(as.character(factor(c("3", "1", "2"))))  # c(3, 1, 2)

When to Choose

适合

  • 统计分析
  • 数据可视化
  • 学术研究
  • 探索性数据分析

不适合

  • Web 开发
  • 生产系统
  • 通用编程
  • 实时应用

对比

方面RPythonJulia
统计优秀良好成长中
可视化ggplot2matplotlibMakie
速度中等
社区统计/生物通用科学

Next Steps

Ecosystem

包管理

# 从 CRAN 安装
install.packages("tidyverse")

# 加载包
library(tidyverse)

# 查看已安装的包
installed.packages()

核心包

  • 数据:dplyr、tidyr、data.table
  • 可视化:ggplot2、plotly
  • 建模:caret、tidymodels
  • 报告:rmarkdown、Quarto