R语言入门学习教程,从入门到精通,R语言基础 - 完整知识点与案例代码(1)

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语言的基础知识:

  1. R语言概述:了解R的起源、特点和绘图能力
  2. 安装配置:R和RStudio的安装与设置
  3. 包管理:包的安装、加载和使用
  4. 变量与对象:R的赋值规则和对象概念
  5. 数据类型:数值、字符、逻辑、整数等
  6. 数据结构:向量、矩阵、数组、数据框、列表、因子
  7. 数据IO:文件的读写和数据抽样方法
  8. 帮助系统:如何高效获取帮助

这些基础知识是后续学习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)
相关推荐
Ice星空2 小时前
使用 uv 进行 python 项目管理
开发语言·python·uv
云深麋鹿2 小时前
C++ | 二叉搜索树
开发语言·c++
永远睡不够的入2 小时前
C++11新特性详解(上):从列表初始化到右值引用
开发语言·c++
lwf0061642 小时前
偏导数学习日记
学习·机器学习
枫叶丹42 小时前
【HarmonyOS 6.0】AVCodec Kit:OH_AVDataSource回调中传递用户自定义数据的深度解析
开发语言·华为·harmonyos
c++圈来了个新人2 小时前
C++类和对象(中)
c语言·开发语言·数据结构·c++·考研·算法
格林威2 小时前
面阵相机 vs 线阵相机:堡盟与海康相机选型差异全解析+python实战演示
开发语言·人工智能·python·数码相机·计算机视觉·视觉检测·工业相机
Go away, devil2 小时前
Java——IO
java·开发语言