R语言详细教程

目录

  1. R语言简介
  2. 安装与环境配置
  3. 基础语法和数据类型
  4. 数据结构
  5. 数据导入与导出
  6. 数据清洗与处理
  7. 数据可视化
  8. 统计分析
  9. 函数编程
  10. 高级应用

1. R语言简介

什么是R语言?

R是一种开源的编程语言和软件环境,专门用于统计分析、数据挖掘和可视化。由Ross Ihaka和Robert Gentleman于1993年在新西兰奥克兰大学创建。

R的特点

  • 免费开源
  • 强大的统计分析能力
  • 丰富的可视化功能
  • 活跃的社区支持
  • 大量的扩展包

2. 安装与环境配置

安装R

  1. 访问CRAN官网:https://cran.r-project.org/
  2. 选择对应操作系统的版本下载安装

安装RStudio(推荐)

RStudio是R的集成开发环境,提供更好的用户体验。

  1. 访问Posit官网:https://posit.co/downloads/
  2. 选择对应系统的版本下载安装RStudio Desktop

基础设置

进入到RStudio后,新建一个R脚本或R笔记。在下方控制台输入代码进行一次性运算,或在脚本区输入多行代码进行复杂运算。同时,运行代码可以选择单行执行,或多行执行,或区块执行。

测试代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
# 查看R版本
version

# 设置工作目录
setwd("D:/my_project")

# 查看工作目录
getwd()

# 安装包
install.packages("package_name")

# 加载包
library(package_name)

3. 基础语法和数据类型

基本运算

1
2
3
4
5
6
7
8
9
10
11
12
13
# 算术运算
1 + 2 # 加法
5 - 3 # 减法
3 * 4 # 乘法
10 / 2 # 除法
2 ^ 3 # 乘方
5 %% 2 # 取余

# 比较运算
3 > 2 # 大于
3 <= 2 # 小于等于
5 == 5 # 等于
5 != 4 # 不等于

变量赋值

1
2
3
4
5
6
7
8
9
10
11
# 使用 <- 或 = 进行赋值
x <- 10
y = 20
name <- "张三"

# 查看变量
print(x)
x

# 删除变量
rm(x)

数据类型

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
# 数值型
num <- 3.14
class(num)

# 整型
int <- 5L
class(int)

# 字符型
char <- "Hello R"
class(char)

# 逻辑型
bool <- TRUE
class(bool)

# 复数
comp <- 3 + 2i
class(comp)

数据类型转换

1
2
3
4
5
# 显式类型转换
as.numeric("123")
as.character(123)
as.logical(1)
as.integer(3.14)

4. 数据结构

向量(Vector)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
# 创建向量
v1 <- c(1, 2, 3, 4, 5)
v2 <- 1:5
v3 <- seq(1, 10, by = 2)
v4 <- rep(1, 5)

# 向量运算
v1 + v2
v1 * 2
sum(v1)
mean(v1)
length(v1)

# 访问向量元素
v1[1] # R索引从1开始
v1[2:4]
v1[c(1, 3, 5)]
v1[v1 > 3]

矩阵(Matrix)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
# 创建矩阵
m1 <- matrix(1:9, nrow = 3, ncol = 3)
m2 <- matrix(1:6, nrow = 2, byrow = TRUE)

# 矩阵运算
m1 + m1
m1 * 2
t(m1) # 转置
m1 %*% m1 # 矩阵乘法

# 访问矩阵元素
m1[1, 2] # 第1行第2列
m1[1, ] # 第1行
m1[, 2] # 第2列

数据框(Data Frame)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
# 创建数据框
df <- data.frame(
name = c("Alice", "Bob", "Charlie"),
age = c(25, 30, 35),
salary = c(50000, 60000, 70000),
stringsAsFactors = FALSE
)

# 查看数据框结构
str(df)
summary(df)
head(df)
names(df)

# 访问数据框
df$name
df[1, ]
df[, 2]
df[df$age > 25, ]

列表(List)

1
2
3
4
5
6
7
8
9
10
11
12
# 创建列表
my_list <- list(
name = "John",
scores = c(85, 92, 78),
matrix = matrix(1:4, nrow = 2),
details = list(age = 25, city = "Beijing")
)

# 访问列表元素
my_list$name
my_list[[2]]
my_list[["scores"]]

因子(Factor)

1
2
3
4
5
6
7
8
9
# 创建因子
gender <- factor(c("Male", "Female", "Male", "Female"))
levels(gender)
table(gender)

# 有序因子
grade <- factor(c("A", "B", "C", "A"),
levels = c("C", "B", "A"),
ordered = TRUE)

5. 数据导入与导出

读取CSV文件

1
2
3
4
5
6
7
8
9
10
11
# 读取CSV
data <- read.csv("data.csv")

# 设置参数
data <- read.csv("data.csv",
header = TRUE,
stringsAsFactors = FALSE,
na.strings = c("", "NA"))

# 写入CSV
write.csv(data, "output.csv", row.names = FALSE)

读取Excel文件

1
2
3
4
5
6
7
8
9
# 使用readxl包
library(readxl)

# 读取Excel
data <- read_excel("data.xlsx", sheet = 1)

# 写入Excel(使用openxlsx包)
library(openxlsx)
write.xlsx(data, "output.xlsx")

其他格式

1
2
3
4
5
6
7
8
9
10
# 读取文本文件
data <- read.table("data.txt", header = TRUE)

# 读取SPSS文件
library(foreign)
data <- read.spss("data.sav", to.data.frame = TRUE)

# 保存R数据
save(data, file = "mydata.RData")
load("mydata.RData")

6. 数据清洗与处理

处理缺失值

1
2
3
4
5
6
7
8
# 检测缺失值
is.na(data)
sum(is.na(data))
colSums(is.na(data))

# 处理缺失值
data_clean <- na.omit(data) # 删除含缺失值的行
data$column[is.na(data$column)] <- mean(data$column, na.rm = TRUE) # 用均值填充

数据转换

1
2
3
4
5
6
7
# 数据类型转换
data$column <- as.numeric(data$column)
data$category <- as.factor(data$category)

# 创建新变量
data$new_var <- data$var1 + data$var2
data$category <- ifelse(data$score > 60, "Pass", "Fail")

数据筛选和排序

1
2
3
4
5
6
7
8
9
10
11
# 使用基础R
subset_data <- data[data$age > 25 & data$salary > 50000, ]
sorted_data <- data[order(data$salary, decreasing = TRUE), ]

# 使用dplyr包
library(dplyr)

filtered_data <- data %>%
filter(age > 25, salary > 50000) %>%
arrange(desc(salary)) %>%
select(name, age, salary)

数据聚合

1
2
3
4
5
6
7
8
9
10
11
# 使用基础R
aggregate(salary ~ department, data = data, mean)

# 使用dplyr
summary_data <- data %>%
group_by(department, gender) %>%
summarise(
avg_salary = mean(salary),
count = n(),
max_age = max(age)
)

7. 数据可视化

基础绘图

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
# 散点图
plot(data$age, data$salary,
main = "年龄与工资关系",
xlab = "年龄",
ylab = "工资",
col = "blue",
pch = 16)

# 直方图
hist(data$salary,
main = "工资分布",
xlab = "工资",
col = "lightblue")

# 箱线图
boxplot(salary ~ department, data = data,
main = "各部门工资分布",
col = "lightgreen")

使用ggplot2包

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
library(ggplot2)

# 散点图
ggplot(data, aes(x = age, y = salary, color = department)) +
geom_point() +
labs(title = "年龄与工资关系", x = "年龄", y = "工资") +
theme_minimal()

# 柱状图
ggplot(data, aes(x = department, fill = gender)) +
geom_bar(position = "dodge") +
labs(title = "各部门性别分布")

# 折线图
time_series <- data.frame(
month = 1:12,
sales = c(100, 120, 130, 150, 140, 160, 170, 180, 190, 200, 210, 220)
)

ggplot(time_series, aes(x = month, y = sales)) +
geom_line(color = "blue", size = 1) +
geom_point(color = "red", size = 2) +
labs(title = "月度销售趋势")

8. 统计分析

描述性统计

1
2
3
4
5
6
7
8
9
10
# 基本统计量
summary(data)

# 更详细的描述统计
library(psych)
describe(data)

# 相关分析
cor(data$age, data$salary)
cor_matrix <- cor(data[, c("age", "salary", "experience")])

假设检验

1
2
3
4
5
6
7
8
9
# t检验
t.test(salary ~ gender, data = data)

# 方差分析
anova_result <- aov(salary ~ department, data = data)
summary(anova_result)

# 卡方检验
chisq.test(data$department, data$gender)

回归分析

1
2
3
4
5
6
7
8
9
10
11
12
# 线性回归
model <- lm(salary ~ age + experience + education, data = data)
summary(model)

# 逻辑回归
logit_model <- glm(promoted ~ age + performance,
data = data,
family = binomial)
summary(logit_model)

# 模型诊断
plot(model)

9. 函数编程

创建函数

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
# 基本函数
calculate_bmi <- function(weight, height) {
bmi <- weight / (height ^ 2)
return(bmi)
}

# 带默认参数的函数
greet <- function(name = "朋友") {
paste("你好,", name)
}

# 多返回值函数
summary_stats <- function(x) {
list(
mean = mean(x),
sd = sd(x),
n = length(x)
)
}

控制结构

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
# if-else语句
grade <- function(score) {
if (score >= 90) {
return("A")
} else if (score >= 80) {
return("B")
} else if (score >= 70) {
return("C")
} else {
return("F")
}
}

# for循环
for (i in 1:5) {
print(paste("这是第", i, "次循环"))
}

# while循环
count <- 1
while (count <= 5) {
print(count)
count <- count + 1
}

应用函数

1
2
3
4
5
6
7
8
9
10
# apply系列函数
matrix_data <- matrix(1:12, nrow = 3)

apply(matrix_data, 1, sum) # 按行求和
apply(matrix_data, 2, mean) # 按列求平均

# lapply和sapply
my_list <- list(a = 1:5, b = 6:10)
lapply(my_list, mean) # 返回列表
sapply(my_list, mean) # 返回向量

10. 高级应用

数据重塑

1
2
3
4
5
6
7
8
9
10
11
12
13
# 使用tidyr包
library(tidyr)

# 宽数据转长数据
long_data <- pivot_longer(data,
cols = c("jan", "feb", "mar"),
names_to = "month",
values_to = "sales")

# 长数据转宽数据
wide_data <- pivot_wider(long_data,
names_from = "month",
values_from = "sales")

字符串处理

1
2
3
4
5
6
7
8
# 使用stringr包
library(stringr)

str_length("Hello") # 字符串长度
str_to_upper("hello") # 转为大写
str_replace("Hello World", "World", "R") # 替换
str_split("a,b,c", ",") # 分割字符串
str_detect(c("apple", "banana"), "app") # 检测模式

日期处理

1
2
3
4
5
6
7
8
9
10
11
12
13
# 使用lubridate包
library(lubridate)

today() # 今天日期
ymd("2023-12-25") # 解析日期
mdy("December 25, 2023")
year(today()) # 提取年份
month(today(), label = TRUE) # 提取月份

# 日期运算
date1 <- ymd("2023-01-01")
date2 <- ymd("2023-12-31")
interval(date1, date2) / days(1) # 天数差

性能优化

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# 向量化操作(推荐)
system.time({
result <- sqrt(1:1000000)
})

# 循环操作(不推荐)
system.time({
result <- numeric(1000000)
for (i in 1:1000000) {
result[i] <- sqrt(i)
}
})

# 使用data.table处理大数据
library(data.table)
dt <- as.data.table(data)
result <- dt[age > 25, .(avg_salary = mean(salary)), by = department]

创建报告

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
# 使用R Markdown
# 安装rmarkdown包后,可以创建包含代码、结果和文字说明的动态文档

# 使用shiny创建交互式应用
library(shiny)

ui <- fluidPage(
titlePanel("我的Shiny应用"),
sidebarLayout(
sidebarPanel(
sliderInput("bins", "分箱数:", min = 1, max = 50, value = 30)
),
mainPanel(
plotOutput("distPlot")
)
)
)

server <- function(input, output) {
output$distPlot <- renderPlot({
x <- faithful$waiting
bins <- seq(min(x), max(x), length.out = input$bins + 1)
hist(x, breaks = bins, col = 'darkgray', border = 'white')
})
}

shinyApp(ui = ui, server = server)

学习资源推荐

在线资源

推荐书籍

  • 《R数据科学》
  • 《R语言实战》
  • 《高级R语言编程指南》

练习平台


这个教程涵盖了R语言从基础到高级的主要知识点。建议按照顺序学习,并通过实际项目来巩固所学内容。R语言的学习需要大量的实践,多写代码、多解决问题是掌握这门语言的关键。