R语言基础 - 完整知识点与案例代码
1.1 R语言概述
1.1.1 R语言的诞生
R语言由Ross Ihaka和Robert Gentleman于1993年在新西兰奥克兰大学开发,起源于S语言。
1.1.2 R语言的特点
- 免费开源
- 强大的统计分析功能
- 顶尖的绘图能力
- 活跃的社区支持
- 跨平台运行
1.1.3 R语言绘图系统
- 基础绘图系统(base plot)
- lattice网格绘图系统
- ggplot2绘图系统
- plotly交互式绘图系统
1.1.4 图形语法
图形语法是Hadley Wickham提出的理论,将图形分解为:数据、映射、几何对象、统计变换、坐标系、分面等组件。
r
# 图形语法示例:使用ggplot2绘制散点图
# 安装ggplot2包(如未安装)
install.packages("ggplot2")
# 加载ggplot2包
library(ggplot2)
# 创建示例数据
data <- data.frame(
x = c(1, 2, 3, 4, 5), # x坐标值
y = c(2, 4, 6, 8, 10) # y坐标值
)
# 图形语法构建:数据 + 映射 + 几何对象
ggplot(data = data, # 1. 数据层
mapping = aes(x = x, y = y)) + # 2. 映射层:x和y轴
geom_point(color = "blue", size = 3) + # 3. 几何对象:散点
geom_line(color = "red") + # 3. 几何对象:线条
labs(title = "图形语法示例", # 4. 标签层:标题
x = "X轴", # x轴标签
y = "Y轴") + # y轴标签
theme_minimal() # 5. 主题层:简约风格
1.2 R语言的获取与安装
1.2.1 安装程序下载
官网地址:https://cran.r-project.org/
1.2.2 R语言的安装与启动
r
# 安装完成后,启动R后可以查看版本信息
# 查看R版本
version
# 或使用简写
R.version.string
# 查看当前工作目录
getwd()
# 设置工作目录(示例)
# setwd("C:/MyRProject") # Windows示例
# setwd("/Users/name/R") # Mac示例
1.3 辅助工具RStudio
r
# 在RStudio中可以执行的常用操作
# 清除控制台
# Ctrl+L (Windows/Linux) 或 Cmd+L (Mac)
# 查看已安装的包
installed.packages()[1:5, 1] # 查看前5个包名
# 查看当前R会话中加载的包
search()
1.4 包的安装与加载
r
# 1.4.1 包的安装方式
# 方式1:从CRAN安装
install.packages("dplyr") # 安装单个包
install.packages(c("tidyr", "readr")) # 安装多个包
# 方式2:安装开发版(需devtools包)
# install.packages("devtools")
# devtools::install_github("tidyverse/ggplot2")
# 1.4.2 包的加载方式
# 方式1:library()加载
library(dplyr) # 加载dplyr包,加载失败会报错
# 方式2:require()加载
require(ggplot2) # 加载ggplot2包,加载失败返回FALSE
# 1.4.3 包的管理
# 查看已安装的所有包
library() # 或 installed.packages()
# 查看包的详细信息
# packageDescription("dplyr")
# 更新所有包
# update.packages()
# 卸载包
# remove.packages("包名")
# 1.4.4 使用包中的函数(不加载整个包)
# dplyr::filter() # 使用双冒号调用函数
1.5 对象与变量
1.5.1 对象
R中一切皆对象(向量、矩阵、数据框、函数等)
1.5.2 变量
变量是存储对象的名称
r
# 1.5 变量命名与赋值
# 赋值操作符
x <- 10 # 最常用的左箭头赋值
y = 20 # 等号赋值(不推荐)
30 -> z # 右箭头赋值(不常用)
# 变量命名规则
my_var <- 1 # 使用下划线(推荐)
myVar <- 2 # 驼峰命名
.myVar <- 3 # 点开头(隐藏变量)
MyVar <- 4 # 大写开头
# 查看变量
print(x) # 打印变量
x # 直接输入变量名也可打印
ls() # 列出当前环境所有变量
# 删除变量
rm(x) # 删除单个变量
rm(list = ls()) # 删除所有变量(慎用)
1.6 数据结构
1.6.1 数据类型
r
# R中的基本数据类型
# 1. 数值型(numeric)
num1 <- 10 # 整数(实际存储为双精度)
num2 <- 3.14 # 浮点数
num3 <- 2e5 # 科学计数法:200000
# 2. 整型(integer)
int1 <- 10L # 添加L后缀表示整数
int2 <- as.integer(3.14) # 转换:结果为3
# 3. 字符型(character)
char1 <- "Hello" # 双引号
char2 <- 'World' # 单引号
char3 <- "123" # 数字作为字符
# 4. 逻辑型(logical)
log1 <- TRUE # 真
log2 <- FALSE # 假
log3 <- T # 简写
log4 <- F # 简写
# 5. 复数型(complex)
comp <- 1 + 2i # 复数
# 6. 原始型(raw)
raw1 <- as.raw(65) # 原始字节
# 数据类型检查
class(num1) # "numeric"
class(int1) # "integer"
class(char1) # "character"
class(log1) # "logical"
# 数据类型转换
as.numeric("123") # 字符转数值:123
as.character(456) # 数值转字符:"456"
as.logical(1) # 数值转逻辑:TRUE(0为FALSE,非0为TRUE)
as.integer(3.9) # 数值转整数:3(截断)
1.6.2 向量
r
# 向量的创建
# 使用c()函数创建
vec1 <- c(1, 2, 3, 4, 5) # 数值向量
vec2 <- c("a", "b", "c") # 字符向量
vec3 <- c(TRUE, FALSE, TRUE) # 逻辑向量
# 使用运算符创建
vec4 <- 1:10 # 生成1到10的整数序列
vec5 <- seq(from = 1, to = 10, by = 2) # 1,3,5,7,9
vec6 <- rep(1:3, times = 2) # 重复:1,2,3,1,2,3
vec7 <- rep(1:3, each = 2) # 每个重复2次:1,1,2,2,3,3
# 向量运算
a <- c(1, 2, 3)
b <- c(4, 5, 6)
a + b # 向量加法:5,7,9
a * b # 向量乘法:4,10,18
a ^ 2 # 平方:1,4,9
sqrt(a) # 平方根:1,1.414,1.732
# 向量索引(下标从1开始)
v <- c(10, 20, 30, 40, 50)
v[1] # 第1个元素:10
v[c(2, 4)] # 第2和4个元素:20,40
v[2:4] # 第2到4个元素:20,30,40
v[-3] # 排除第3个元素:10,20,40,50
v[v > 30] # 逻辑索引:40,50
# 向量化操作
# 无需循环,直接对每个元素操作
scores <- c(60, 75, 85, 90)
scores + 5 # 每个成绩加5
scores >= 80 # 是否大于等于80:FALSE,FALSE,TRUE,TRUE
mean(scores) # 平均值:77.5
sum(scores) # 总和:310
length(scores) # 长度:4
1.6.3 矩阵与数组
r
# 矩阵的创建
# matrix(data, nrow, ncol, byrow, dimnames)
# 创建3行2列的矩阵,按列填充(默认)
m1 <- matrix(1:6, nrow = 3, ncol = 2)
# [,1] [,2]
# [1,] 1 4
# [2,] 2 5
# [3,] 3 6
# 按行填充
m2 <- matrix(1:6, nrow = 2, ncol = 3, byrow = TRUE)
# [,1] [,2] [,3]
# [1,] 1 2 3
# [2,] 4 5 6
# 添加行名和列名
rownames <- c("Row1", "Row2", "Row3")
colnames <- c("Col1", "Col2")
m3 <- matrix(1:6, nrow = 3, ncol = 2,
dimnames = list(rownames, colnames))
# 矩阵索引
m <- matrix(1:9, nrow = 3)
m[2, 3] # 第2行第3列:8
m[2, ] # 第2行所有列:4,5,6
m[, 3] # 第3列所有行:7,8,9
m[1:2, 2:3] # 子矩阵
# 矩阵运算
A <- matrix(1:4, nrow = 2)
B <- matrix(5:8, nrow = 2)
A + B # 矩阵加法
A %*% B # 矩阵乘法(注意%*%)
t(A) # 矩阵转置
det(A) # 行列式
solve(A) # 逆矩阵
diag(3) # 3x3单位矩阵
# 数组(多维矩阵)
arr <- array(1:24, dim = c(3, 4, 2)) # 3行4列2个矩阵
# 查看数组
dim(arr) # 维度:3,4,2
arr[2, 3, 1] # 第1个矩阵的第2行第3列
1.6.4 数据框
r
# 数据框的创建
# data.frame()函数创建,类似Excel表格
df <- data.frame(
name = c("张三", "李四", "王五"), # 字符列
age = c(25, 30, 28), # 数值列
score = c(85.5, 92.0, 78.5), # 数值列
is_pass = c(TRUE, TRUE, FALSE) # 逻辑列
)
# 查看数据框
print(df)
str(df) # 查看数据结构
summary(df) # 统计摘要
head(df, 2) # 前2行
tail(df, 2) # 后2行
# 数据框的访问方式
# 方式1:$符号
df$name # 获取name列
df$age # 获取age列
df$score[2] # score列的第2个元素
# 方式2:方括号[行,列]
df[1, ] # 第1行
df[, 2] # 第2列
df[2, 3] # 第2行第3列
df[c(1, 3), c("name", "score")] # 第1、3行的name和score列
# 方式3:双中括号
df[["age"]] # 提取age列
# 添加新列
df$grade <- c("B", "A", "C") # 添加grade列
# 修改列
df$age <- df$age + 1 # 年龄加1
# 删除列
df$grade <- NULL # 删除grade列
# 条件筛选
df[df$score > 80, ] # 分数大于80的行
subset(df, age >= 25 & score > 80) # 年龄>=25且分数>80
# 数据框的操作函数
nrow(df) # 行数:3
ncol(df) # 列数:4
dim(df) # 维度:3 4
names(df) # 列名
rownames(df) # 行名
1.6.5 列表
r
# 列表的创建
# 列表可以包含任意类型的数据
lst <- list(
name = "张三", # 字符元素
age = 25, # 数值元素
scores = c(85, 90, 78), # 向量元素
matrix_data = matrix(1:4, nrow = 2), # 矩阵元素
df_data = data.frame(x = 1:3, y = 4:6) # 数据框元素
)
# 查看列表
print(lst)
str(lst) # 查看列表结构
# 列表的访问
# 方式1:$符号
lst$name # "张三"
lst$scores[2] # 90
# 方式2:双中括号
lst[[2]] # 25
lst[["age"]] # 25
# 方式3:单中括号(返回子列表)
lst[1] # 返回包含name的子列表
lst[c("name", "age")] # 返回子列表
# 区别:[[ ]]返回元素本身,[ ]返回子列表
is.list(lst[1]) # TRUE,是列表
is.vector(lst[[1]]) # TRUE,是向量
# 添加元素
lst$new_element <- "新元素" # 添加新元素
# 删除元素
lst$new_element <- NULL # 删除元素
# 列表合并
lst1 <- list(a = 1, b = 2)
lst2 <- list(c = 3, d = 4)
lst_combined <- c(lst1, lst2) # 合并为4个元素的列表
# 列表转向量(需同类型)
unlist(lst1) # 命名向量
1.6.6 因子
r
# 因子的创建
# 因子用于处理分类变量
# 创建因子
gender <- factor(c("男", "女", "男", "女", "男"))
print(gender)
# [1] 男 女 男 女 男
# Levels: 男 女
# 指定水平顺序
size <- factor(c("大", "中", "小", "中", "大"),
levels = c("小", "中", "大"))
print(size)
# Levels: 小 中 大(按指定顺序)
# 有序因子
rating <- factor(c("好", "中", "差", "中", "好"),
levels = c("差", "中", "好"),
ordered = TRUE)
# 差 < 中 < 好
# 因子的属性
levels(gender) # 水平:"男","女"
nlevels(gender) # 水平数量:2
table(gender) # 频数统计
# 因子转换
# 因子转数值(注意:直接转会得到水平编号)
as.numeric(size) # 得到:3,2,1,2,3
# 因子转字符
as.character(gender) # "男","女","男","女","男"
# 数值转因子
scores <- c(60, 75, 85, 90, 65)
score_level <- cut(scores,
breaks = c(0, 60, 70, 80, 90, 100),
labels = c("不及格", "及格", "中等", "良好", "优秀"))
table(score_level)
# 因子的应用
# 在统计分析中自动处理分类变量
tapply(scores, gender, mean) # 按性别计算平均分
1.7 数据存取与抽样
1.7.1 数据存取
r
# 设置工作目录
# setwd("C:/MyData") # 设置工作目录
# 1. 读取CSV文件
# 创建示例数据
df_demo <- data.frame(
ID = 1:5,
Name = c("A", "B", "C", "D", "E"),
Value = c(10, 20, 30, 40, 50)
)
# 写入CSV文件
write.csv(df_demo, "demo_data.csv", row.names = FALSE)
# 读取CSV文件
df_read <- read.csv("demo_data.csv",
fileEncoding = "UTF-8") # 处理中文编码
# 2. 读取Excel文件(需要readxl包)
# install.packages("readxl")
library(readxl)
# df_excel <- read_excel("data.xlsx", sheet = 1)
# 3. 读取TXT文件
write.table(df_demo, "demo_data.txt", sep = "\t", row.names = FALSE)
df_txt <- read.table("demo_data.txt", header = TRUE, sep = "\t")
# 4. 保存R对象
save(df_demo, file = "demo_data.RData") # 保存单个对象
save.image("all_data.RData") # 保存整个环境
load("demo_data.RData") # 加载RData
# 5. 保存为RDS格式(单个对象)
saveRDS(df_demo, "demo_data.rds")
df_rds <- readRDS("demo_data.rds")
# 6. 从剪贴板读取
# df_clip <- read.table("clipboard", header = TRUE) # Windows
# df_clip <- read.table(pipe("pbpaste"), header = TRUE) # Mac
1.7.2 数据抽样
r
# 设置随机种子,使结果可重复
set.seed(123)
# 创建示例数据
population <- 1:100 # 总体:1到100
# 1. 简单随机抽样
sample(population, size = 10) # 随机抽取10个
sample(population, size = 10, replace = TRUE) # 有放回抽样
# 2. 按比例抽样
df <- data.frame(
id = 1:1000,
group = rep(c("A", "B", "C"), length.out = 1000),
value = rnorm(1000) # 正态分布随机数
)
# 按组分层抽样(每层抽取20%)
library(dplyr) # 使用dplyr进行分层抽样
df_sample <- df %>%
group_by(group) %>% # 按group分组
sample_frac(size = 0.2) # 每层抽取20%
# 3. 系统抽样
systematic_sample <- function(data, k) {
# data: 总体数据
# k: 抽样间隔
start <- sample(1:k, 1) # 随机起点
indices <- seq(start, length(data), by = k)
return(data[indices])
}
systematic_sample(population, 10)
# 4. 使用caTools包进行分割
# install.packages("caTools")
library(caTools)
set.seed(456)
split_mask <- sample.split(df$group, SplitRatio = 0.7) # 70%训练集
train_data <- df[split_mask, ] # 训练集
test_data <- df[!split_mask, ] # 测试集
# 5. K折交叉验证抽样
# install.packages("caret")
library(caret)
folds <- createFolds(df$group, k = 5) # 创建5折索引
# folds[[1]] # 第1折的索引
1.8 获取帮助信息
1.8.1 使用内置帮助函数
r
# 1. 帮助文档
help(mean) # 查看mean函数的帮助
?mean # 等同于help(mean)
??mean # 模糊搜索
# 2. 示例代码
example(mean) # 运行mean函数的示例
example("for") # 查看for循环示例
# 3. 搜索函数
help.search("regression") # 搜索回归相关函数
apropos("test") # 查找名称包含"test"的函数
# 4. 查看函数源代码
mean # 直接输入函数名查看代码
print(mean) # 打印函数内容
# View(mean) # 在RStudio中打开
# 5. 包帮助
help(package = "ggplot2") # 查看包的帮助
vignette(package = "dplyr") # 查看包的vignette
vignette("dplyr") # 查看具体vignette
# 6. 演示函数
demo() # 查看所有演示
demo(graphics) # 运行图形演示
# 7. 获取R内置数据集信息
library(help = "datasets") # 查看内置数据集
data() # 列出所有内置数据集
?iris # 查看iris数据集帮助
head(iris) # 查看iris数据前6行
# 8. 错误信息理解
# 常见错误示例
# 1:10 + "a" # 报错:二元运算符的非数值参数
# 调试技巧
traceback() # 查看错误调用栈
# 9. 在线资源
# R官网: https://www.r-project.org/
# CRAN: https://cran.r-project.org/
# RStudio: https://posit.co/
# R文档: https://rdrr.io/
1.9 R语言相关软件和资料
r
# 1. 查看已安装包和R信息
sessionInfo() # 显示R会话完整信息
Sys.info() # 系统信息
R.version # R版本信息
# 2. 设置R选项
options(digits = 3) # 设置数字显示位数
options(stringsAsFactors = FALSE) # 默认不将字符转为因子
# 3. 内存管理
memory.limit() # 内存限制(Windows)
gc() # 垃圾回收
# 4. 工作环境
getwd() # 获取工作目录
ls() # 列出当前环境对象
rm(list = ls()) # 清空所有对象
# 5. 常用快捷键(RStudio)
# Ctrl+Enter: 运行当前行/选中代码
# Ctrl+Shift+Enter: 运行全部
# Ctrl+L: 清空控制台
# Ctrl+Shift+C: 注释/取消注释
# Tab: 自动补全
# F1: 帮助文档
本章小结
本章涵盖了R语言的基础知识:
- R语言概述:了解R的起源、特点和绘图能力
- 安装配置:R和RStudio的安装与设置
- 包管理:包的安装、加载和使用
- 变量与对象:R的赋值规则和对象概念
- 数据类型:数值、字符、逻辑、整数等
- 数据结构:向量、矩阵、数组、数据框、列表、因子
- 数据IO:文件的读写和数据抽样方法
- 帮助系统:如何高效获取帮助
这些基础知识是后续学习R语言数据分析和可视化的前提。
r
# 本章综合练习
# 练习1:创建数据框并操作
students <- data.frame(
id = 1:10,
name = paste0("Student_", 1:10),
math = round(runif(10, 60, 100)),
english = round(runif(10, 65, 98)),
stringsAsFactors = FALSE
)
# 添加总分列
students$total <- students$math + students$english
# 筛选数学>80的学生
good_math <- students[students$math > 80, ]
# 按总分排序
students_sorted <- students[order(students$total, decreasing = TRUE), ]
# 练习2:随机抽样
set.seed(2024)
sample_index <- sample(1:nrow(students), size = 5)
sample_students <- students[sample_index, ]
# 练习3:因子应用
students$grade <- cut(students$total,
breaks = c(0, 120, 140, 160, 200),
labels = c("C", "B", "A", "优秀"))
table(students$grade)
# 查看结果
print(students)