R语言快速入门

R语言是一种专为统计计算和数据分析设计的编程语言和软件环境,广泛用于数据科学、统计建模、数据可视化、机器学习等领域。(事实上,除了极少领域,R已经被Python全方位替代了🤣)

R几乎是和Python一样简单明了,下面列举以下R语言的代码特殊地方,使一个使用其他语言编程的人可以快速读懂R语言代码:

基本

赋值符号

  • R的独特之处:R中常用 <- 来表示赋值,虽然 = 也可以用,但 <- 更常见。
  • 示例
    1
    2
    x <- 10  # 使用<- 赋值
    y = 20 # 使用= 赋值
  • 其他语言对比:其他语言通常使用 = 进行赋值。

索引从1开始

  • R的独特之处:R的向量、数组和矩阵索引从1开始。

  • 示例

    1
    2
    x <- c(10, 20, 30)
    print(x[1]) # 输出: 10
  • 其他语言对比:像C、Python、Java等大多数编程语言的数组索引是从0开始的。

负数索引

R中的索引不仅可以使用正数,还可以使用负数。负数索引用于排除某些元素,即返回除了被负数索引的元素以外的所有元素。

  • 用法:当你想从一个向量或数据框中排除某个元素时,可以使用负数索引。

  • 示例

    1
    2
    3
    r复制代码x <- c(10, 20, 30, 40, 50)
    print(x[-2]) # 输出: 10 30 40 50,排除了第2个元素20
    print(x[-c(1, 3)]) # 输出: 20 40 50,排除了第1和第3个元素
  • 说明:负数索引告诉R排除指定位置的元素,与其他编程语言不同,R中没有直接的删除操作,而是通过负数索引实现过滤。在Python中负数索引倒数。

函数定义与返回值

  • R的独特之处:R中的函数通过 function 关键字定义,且函数中的最后一行表达式会自动返回值,也可以使用 return() 明确返回值。
  • 示例
    1
    2
    3
    4
    5
    my_function <- function(x) {
    y <- x * 2
    y # 自动返回最后一行的结果
    }
    print(my_function(5)) # 输出: 10
  • 其他语言对比:其他语言通常需要显式使用 return 语句返回值。

缺失值和逻辑运算

  • R的独特之处:R使用 NA 表示缺失值,不能直接用逻辑运算符比较 NA,需要使用 is.na() 函数来检查。
  • 示例
    1
    2
    x <- c(1, 2, NA, 4)
    print(is.na(x)) # 输出: FALSE FALSE TRUE FALSE
  • 其他语言对比:在其他语言中,可能会使用 nullNone 来表示缺失值。

数据类型的灵活转换

  • R的独特之处:R自动执行数据类型转换,例如在计算中数字和字符之间的转换。某些情况可能会导致意外的行为。

  • 示例

    1
    2
    x <- c(1, "text", 3)
    print(x) # 输出: "1" "text" "3"(都被转换为字符类型)
  • 其他语言对比:许多语言需要明确指定类型转换。

向量与列表的区别

  • R的独特之处:R中向量必须是同类型的,而列表可以包含不同类型的数据。

  • 示例

    1
    2
    v <- c(1, 2, 3)  # 向量
    l <- list(1, "text", TRUE) # 列表

管道操作符 %>%

管道操作符 %>% 来自 magrittr 包,被广泛用于 dplyr 等包中。它用于将左侧表达式的结果作为右侧函数的输入,从而可以简化代码的结构,提升可读性。

  • 用法:将一个表达式的输出直接传递给下一个函数作为输入,避免嵌套多层函数调用。

  • 示例

    1
    2
    3
    4
    5
    6
    7
    8
    9
    library(dplyr)
    data <- data.frame(x = 1:5, y = 6:10)
    # 不使用管道操作符
    result <- arrange(filter(data, x > 2), desc(y))
    # 使用管道操作符
    result <- data %>%
    filter(x > 2) %>%
    arrange(desc(y))
    print(result)
  • 说明:管道操作符 %>% 可以避免嵌套函数调用,让代码更清晰直观。它通过将前面的结果传递给下一个函数,仿佛是逐步构建操作链。

组合函数 c()

c() 是 R 中的组合函数,用于创建向量或将元素组合成一个向量。c 代表combine(组合),是R中最常用的函数之一。

  • 用法:将多个数值、字符、布尔值或其他数据组合成一个向量。

  • 示例

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    r复制代码# 数值向量
    x <- c(1, 2, 3, 4, 5)

    # 字符向量
    y <- c("A", "B", "C")

    # 混合向量
    z <- c(1, "B", TRUE)

    print(x) # 输出: 1 2 3 4 5
    print(y) # 输出: "A" "B" "C"
    print(z) # 输出: "1" "B" "TRUE" (都被转为字符)
  • 说明c() 会将输入的元素组合成一个向量,并且如果元素类型不同,会进行类型转换(通常转为字符类型)。

which() 函数

which() 是一个非常有用的函数,它用于返回满足条件的索引。常用于查找满足逻辑条件的元素在向量或数据框中的位置。

  • 用法:传递一个逻辑向量,which() 会返回为 TRUE 的索引。

  • 示例

    1
    2
    3
    4
    5
    6
    7
    8
    9
    r复制代码x <- c(5, 10, 15, 20, 25)

    # 查找大于10的元素索引
    idx <- which(x > 10)
    print(idx) # 输出: 3 4 5

    # 查找等于20的元素索引
    idx <- which(x == 20)
    print(idx) # 输出: 4
  • 说明which() 返回满足条件的元素在向量中的位置,非常适合用于数据子集选择或条件过滤。

数据框(Data Frame)

  • R的独特之处:数据框是R中特别常用的数据结构,类似于SQL表格或Excel中的数据表。它是一个二维列表,列是不同类型的数据,行表示观测值。

  • 示例

    1
    2
    3
    4
    5
    6
    df <- data.frame(Name = c("Alice", "Bob"), Age = c(25, 30))
    print(df)
    # 输出:
    # Name Age
    # 1 Alice 25
    # 2 Bob 30
  • 其他语言对比:Python中使用Pandas库的DataFrame类似。

统计分析

这是一些较常用的设计统计分析的函数,更多函数可以参考相关手册

示例数据

1
2
# 创建一个示例数据集
data <- c(5, 10, 15, 20, 25, 30, 35, 40, 45, 50)

summary()

汇总统计信息

1
2
summary(data)
# 输出:最小值、四分位数、均值、最大值等

mean()

计算均值

1
2
3
mean_value <- mean(data)
mean_value
# 输出:均值,例如 27.5

median()

计算中位数

1
2
3
median_value <- median(data)
median_value
# 输出:中位数,例如 27.5

sd()

计算标准差

1
2
3
sd_value <- sd(data)
sd_value
# 输出:标准差,例如 15.13825

var()

计算方差

1
2
3
var_value <- var(data)
var_value
# 输出:方差,例如 229.1667

range()

计算数据的范围(最小值和最大值)

1
2
3
range_value <- range(data)
range_value
# 输出:范围,例如 5 50

quantile()

计算分位数

1
2
3
quantiles <- quantile(data)
quantiles
# 输出:0%、25%、50%、75%、100%的分位数

cor()

计算相关系数

1
2
3
4
5
6
# 假设有另一个数据集
data2 <- c(2, 4, 6, 8, 10, 12, 14, 16, 18, 20)

correlation <- cor(data, data2)
correlation
# 输出:相关系数,例如 1(完全正相关)

数据可视化

示例数据

1
2
3
# 创建一个简单的数据集
x <- c(1, 2, 3, 4, 5)
y <- c(2, 4, 6, 8, 10)

plot()

绘制基础散点图、线图

1
2
# 绘制散点图
plot(x, y, main="Scatter Plot", xlab="X Axis", ylab="Y Axis")

hist()

绘制直方图

1
2
3
4
5
# 创建一组随机数据
data <- rnorm(100)

# 绘制直方图
hist(data, main="Histogram", xlab="Values", col="lightblue", border="black")

boxplot()

绘制箱线图

1
2
# 绘制箱线图
boxplot(data, main="Boxplot", ylab="Values", col="lightgreen")

barplot()

绘制柱状图

pie()

绘制饼图

pairs()

绘制散点矩阵

1
2
# 使用内置数据集绘制散点矩阵
pairs(iris[,1:4], main="Scatterplot Matrix for Iris Data")

lines()

绘制线图

1
2
3
4
# 绘制散点图
plot(x, y, main="Line Plot", xlab="X Axis", ylab="Y Axis", type="p")
# 在散点图上添加线条
lines(x, y, col="blue", lwd=2)

heatmap()

热图

1
2
3
4
5
# 创建矩阵数据
data_matrix <- matrix(rnorm(25), nrow=5)

# 绘制热图
heatmap(data_matrix, main="Heatmap", col=heat.colors(10))

事实上,对于复杂的图,一般使用ggplot2包,而不适用R原生的绘图函数绘制。具体接口可查看相关文档。

数据挖掘

R语言提供了丰富的包和函数来实现各种机器学习算法。

K-Means 聚类

kmeans()(K-Means 聚类算法)

1
2
3
4
5
6
7
8
# 使用KMeans进行聚类分析,k=3表示将数据集聚为3类
set.seed(42) # 设置随机种子
kmeans_model <- kmeans(iris[, 1:4], centers = 3)
# 查看聚类结果
print(kmeans_model$cluster)
# 可视化聚类结果
plot(iris$Sepal.Length, iris$Sepal.Width, col=kmeans_model$cluster, pch=19)
points(kmeans_model$centers[,c("Sepal.Length", "Sepal.Width")], col=1:3, pch=8, cex=2)
  • kmeans() 函数用于执行 K-means 聚类,将数据分为预定数量的簇(centers=3表示3个簇)。

回归分析(Regression)

lm()(线性回归)

1
2
3
4
5
6
# 示例数据集:mtcars
data(mtcars)
# 使用线性回归预测汽车的油耗(mpg)与重量(wt)、马力(hp)的关系
model <- lm(mpg ~ wt + hp, data=mtcars)
# 查看模型摘要
summary(model)
  • lm() 函数用于构建线性回归模型,mpg ~ wt + hp 表示预测变量 mpgwthp 的线性组合。

决策树(Decision Tree)

rpart()(决策树算法)

1
2
3
4
5
6
7
8
9
# 加载决策树包
library(rpart)
# 创建决策树模型,使用 `Species` 来预测 `Sepal.Length` 和 `Sepal.Width`
tree_model <- rpart(Species ~ Sepal.Length + Sepal.Width, data=iris, method="class")
# 查看决策树模型
print(tree_model)
# 可视化决策树
plot(tree_model)
text(tree_model, use.n = TRUE)
  • rpart() 函数用于构建决策树模型,method="class" 表示分类任务。

随机森林(Random Forest)

randomForest()(随机森林算法)

1
2
3
4
5
6
# 加载随机森林包
library(randomForest)
# 创建随机森林模型,使用 `Species` 来预测 `Sepal.Length` 和 `Sepal.Width`
rf_model <- randomForest(Species ~ Sepal.Length + Sepal.Width, data=iris)
# 查看模型摘要
print(rf_model)
  • randomForest() 函数用于构建随机森林模型,该模型通过组合多棵决策树来提高预测精度。

朴素贝叶斯(Naive Bayes)

naiveBayes()(朴素贝叶斯算法)

1
2
3
4
5
6
7
8
# 加载朴素贝叶斯包
library(e1071)
# 创建朴素贝叶斯模型
nb_model <- naiveBayes(Species ~ Sepal.Length + Sepal.Width, data=iris)
# 预测分类
predictions <- predict(nb_model, iris)
# 查看模型摘要
print(table(predictions, iris$Species))
  • naiveBayes() 函数实现朴素贝叶斯分类器,通常用于文本分类或其他高维数据集的处理。

支持向量机(SVM)

svm()(支持向量机算法)

1
2
3
4
5
6
7
8
# 加载SVM包
library(e1071)
# 创建SVM模型,预测 `Species`
svm_model <- svm(Species ~ Sepal.Length + Sepal.Width, data=iris)
# 预测分类
svm_predictions <- predict(svm_model, iris)
# 查看预测结果
print(table(svm_predictions, iris$Species))
  • svm() 函数用于构建支持向量机模型,适合于线性不可分的分类问题。