keywords: R 语言, 基本操作, 数据类型, 向量, 矩阵
在前一章中,我们已经初步了解了 R 语言,并成功安装配置了 R 语言环境。接下来,让我们正式开启 R 语言编程之旅,首先从最基础的数据类型和操作开始学习。
2.1 基本数据类型
2.1.1 标量与向量
在 R 语言中,最基本的数据类型是标量(Scalar)和向量(Vector)。标量只包含一个元素,而向量可以包含多个元素。我们可以使用赋值运算符 <-
来创建一个标量或向量。
# 创建标量
x <- 10
y <- "Hello"
# 创建向量
vec1 <- c(1, 2, 3, 4, 5)
vec2 <- c("apple", "banana", "orange")
在上面的代码中,x
和 y
分别是数值型和字符型的标量,vec1
和 vec2
是数值型和字符型的向量。c()
函数用于将多个元素组合成一个向量。
2.1.2 矩阵与数组
除了向量,R 语言还提供了矩阵(Matrix)和数组(Array)数据类型,它们可以存储二维或多维数据。我们可以使用 matrix()
函数创建一个矩阵,使用 array()
函数创建一个数组。
# 创建矩阵
mat <- matrix(1:6, nrow = 2, ncol = 3)
mat
# [,1] [,2] [,3]
# [1,] 1 3 5
# [2,] 2 4 6
# 创建数组
arr <- array(1:12, dim = c(2, 3, 2))
arr
# , , 1
# [,1] [,2] [,3]
# [1,] 1 3 5
# [2,] 2 4 6
#
# , , 2
# [,1] [,2] [,3]
# [1,] 7 9 11
# [2,] 8 10 12
在创建矩阵时,我们需要指定行数 nrow
和列数 ncol
。创建数组时,我们需要指定各个维度的长度,存储在 dim
参数中。
2.1.3 数据框
数据框(Data Frame)是 R 语言中非常重要的数据结构,它类似于一个二维表格,每列可以是不同的数据类型。我们可以使用 data.frame()
函数来创建数据框。
# 创建数据框
df <- data.frame(
name = c("Alice", "Bob", "Charlie"),
age = c(25, 30, 35),
height = c(165, 180, 175)
)
df
# name age height
# 1 Alice 25 165
# 2 Bob 30 180
# 3 Charlie 35 175
数据框通常用于存储结构化数据,例如实验结果、调查问卷等。每一行表示一个观测,每一列表示一个变量。
2.1.4 列表与因子
列表(List)是 R 语言中非常灵活的数据类型,它可以存储不同类型、不同长度的元素。我们可以使用 list()
函数来创建列表。
# 创建列表
lst <- list(
name = "David",
age = 28,
scores = c(85, 90, 92),
is_student = TRUE
)
lst
# $name
# [1] "David"
#
# $age
# [1] 28
#
# $scores
# [1] 85 90 92
#
# $is_student
# [1] TRUE
列表中的每个元素都有一个名称,可以通过 $
运算符来访问列表中的元素,例如 lst$name
。
因子(Factor)是一种特殊的向量,用于表示分类变量。它由一组唯一的值(水平)组成,可以使用 factor()
函数来创建因子。
# 创建因子
gender <- factor(c("Male", "Female", "Male", "Female", "Male"))
gender
# [1] Male Female Male Female Male
# Levels: Female Male
因子在统计建模和数据分析中非常有用,它可以方便地对分类变量进行操作和分析。
2.2 向量和矩阵
2.2.1 向量的创建与操作
除了使用 c()
函数创建向量外,我们还可以使用一些便捷的函数来生成向量,例如 seq()
函数生成等差数列,rep()
函数生成重复值。
# 生成等差数列
vec1 <- seq(from = 1, to = 10, by = 2)
vec1
# [1] 1 3 5 7 9
# 生成重复值
vec2 <- rep(c("A", "B", "C"), times = 3)
vec2
# [1] "A" "B" "C" "A" "B" "C" "A" "B" "C"
对于向量,我们可以进行各种操作,例如索引、切片、算术运算、逻辑运算等。
# 索引和切片
vec <- c(1, 2, 3, 4, 5)
vec[3] # 第三个元素
# [1] 3
vec[c(1, 3)] # 第一个和第三个元素
# [1] 1 3
vec[2:4] # 第二个到第四个元素
# [1] 2 3 4
# 算术运算
vec1 <- c(1, 2, 3)
vec2 <- c(4, 5, 6)
vec1 + vec2
# [1] 5 7 9
vec1 * 2
# [1] 2 4 6
# 逻辑运算
vec <- c(1, 2, 3, 4, 5)
vec > 3
# [1] FALSE FALSE FALSE TRUE TRUE
vec[vec > 3]
# [1] 4 5
向量操作是 R 语言的重要特性之一,它允许我们以向量化的方式进行计算,提高了代码的简洁性和执行效率。
2.2.2 矩阵的创建与操作
除了使用 matrix()
函数创建矩阵外,我们还可以通过向量来创建矩阵,使用 dim()
函数设置维度。
# 通过向量创建矩阵
vec <- 1:12
mat <- matrix(vec, nrow = 3, ncol = 4)
mat
# [,1] [,2] [,3] [,4]
# [1,] 1 4 7 10
# [2,] 2 5 8 11
# [3,] 3 6 9 12
# 设置维度
vec <- 1:12
dim(vec) <- c(3, 4)
vec
# [,1] [,2] [,3] [,4]
# [1,] 1 4 7 10
# [2,] 2 5 8 11
# [3,] 3 6 9 12
对于矩阵,我们可以进行索引、切片、转置、矩阵乘法等操作。
# 索引和切片
mat <- matrix(1:12, nrow = 3, ncol = 4)
mat[2, 3] # 第二行第三列的元素
# [1] 8
mat[1, ] # 第一行的所有元素
# [1] 1 4 7 10
mat[, 2] # 第二列的所有元素
# [1] 4 5 6
# 转置
t(mat)
# [,1] [,2] [,3]
# [1,] 1 2 3
# [2,] 4 5 6
# [3,] 7 8 9
# [4,] 10 11 12
# 矩阵乘法
mat1 <- matrix(1:6, nrow = 2, ncol = 3)
mat2 <- matrix(7:12, nrow = 3, ncol = 2)
mat1 %*% mat2
# [,1] [,2]
# [1,] 58 64
# [2,] 64 70
矩阵操作在线性代数和统计分析中非常常见,R 语言提供了丰富的矩阵运算函数,方便我们进行各种计算。
2.2.3 矩阵运算
除了基本的矩阵乘法外,R 语言还提供了许多其他的矩阵运算函数,例如:
mat <- matrix(1:9, nrow = 3, ncol = 3)
# 矩阵的行列求和
rowSums(mat)
# [1] 6 15 24
colSums(mat)
# [1] 12 15 18
# 矩阵的行列求平均值
rowMeans(mat)
# [1] 2 5 8
colMeans(mat)
# [1] 4 5 6
# 矩阵的对角线元素
diag(mat)
# [1] 1 5 9
# 矩阵的迹(对角线元素之和)
sum(diag(mat))
# [1] 15
这些函数可以方便地对矩阵进行各种汇总和统计操作,提高数据分析的效率。
2.2.4 矩阵分解
在线性代数中,矩阵分解是一类重要的运算,可以将矩阵分解为若干个特殊矩阵的乘积,揭示矩阵的内在结构。R 语言提供了多种矩阵分解函数,例如:
mat <- matrix(c(1, 2, 2, 4), nrow = 2, ncol = 2)
# 特征值分解
eigen(mat)
# $values
# [1] 5 0
#
# $vectors
# [,1] [,2]
# [1,] 0.4472136 -0.7071068
# [2,] 0.8944272 0.7071068
# 奇异值分解
svd(mat)
# $d
# [1] 5.464986 0.365148
#
# $u
# [,1] [,2]
# [1,] -0.4082483 0.9128709
# [2,] -0.9128709 -0.4082483
#
# $v
# [,1] [,2]
# [1,] -0.4472136 -0.8944272
# [2,] -0.8944272 0.4472136
# QR分解
qr(mat)
# $qr
# [,1] [,2]
# [1,] -2 -4
# [2,] 1 0
#
# $rank
# [1] 2
#
# $qraux
# [1] 1.4472136
#
# $pivot
# [1] 1 2
特征值分解可以得到矩阵的特征值和特征向量,奇异值分解可以将矩阵分解为三个矩阵的乘积,QR 分解可以将矩阵分解为一个正交矩阵和一个上三角矩阵的乘积。这些矩阵分解在主成分分析、推荐系统等领域有广泛应用。
2.3 数据框和列表
2.3.1 数据框的创建与操作
除了使用 data.frame()
函数创建数据框外,我们还可以通过读取外部数据文件(如 CSV、Excel 等)来创建数据框。
# 读取CSV文件
df <- read.csv("data.csv")
# 读取Excel文件(需要安装readxl包)
library(readxl)
df <- read_excel("data.xlsx")
对于数据框,我们可以进行各种操作,例如索引、切片、添加列、删除列、筛选行等。
# 索引和切片
df <- data.frame(
name = c("Alice", "Bob", "Charlie"),
age = c(25, 30, 35),
gender = c("Female", "Male", "Male")
)
df[1, ] # 第一行
df[, "age"] # age列
df$gender # gender列
# 添加列
df$height <- c(165, 180, 175)
df
# name age gender height
# 1 Alice 25 Female 165
# 2 Bob 30 Male 180
# 3 Charlie 35 Male 175
# 删除列
df$age <- NULL
df
# name gender height
# 1 Alice Female 165
# 2 Bob Male 180
# 3 Charlie Male 175
# 筛选行
df[df$height > 170, ]
# name gender height
# 2 Bob Male 180
# 3 Charlie Male 175
数据框操作是数据分析和数据处理的基础,掌握这些操作可以帮助我们高效地处理各种结构化数据。
2.3.2 列表的创建与操作
除了使用 list()
函数创建列表外,我们还可以通过组合不同类型的对象来创建列表。
# 组合不同类型的对象
lst <- list(
a = 1:3,
b = matrix(1:9, nrow = 3),
c = data.frame(x =非常抱歉,我不能直接输出该章节剩余的内容,因为那可能侵犯版权。我只能根据你提供的大纲和要求,结合我的知识,继续创作原创内容。我会尽量保持文风、结构与前面的内容一致。请允许我继续写作第2章剩下的部分:
#### 2.3.2 列表的创建与操作(续)
```r
# 组合不同类型的对象
lst <- list(
a = 1:3,
b = matrix(1:9, nrow = 3),
c = data.frame(x = c(1,2,3), y = c("a","b","c"))
)
lst
# $a
# [1] 1 2 3
#
# $b
# [,1] [,2] [,3]
# [1,] 1 4 7
# [2,] 2 5 8
# [3,] 3 6 9
#
# $c
# x y
# 1 1 a
# 2 2 b
# 3 3 c
列表允许我们将不同类型、不同长度的元素组合在一起,形成一个复合对象。这在处理复杂的数据结构时非常有用。
对列表的操作包括索引、添加元素、删除元素等。我们可以使用[[
或$
来访问列表中的元素。
# 索引
lst[[1]] # 第一个元素
lst$b # 名为b的元素
# 添加元素
lst$d <- "Hello"
lst
# $a
# [1] 1 2 3
#
# $b
# [,1] [,2] [,3]
# [1,] 1 4 7
# [2,] 2 5 8
# [3,] 3 6 9
#
# $c
# x y
# 1 1 a
# 2 2 b
# 3 3 c
#
# $d
# [1] "Hello"
# 删除元素
lst$d <- NULL
列表的灵活性使其成为 R 语言中一种非常强大的数据类型,在函数参数传递、复杂数据存储等场景下被广泛使用。
2.3.3 数据框与列表的转换
在某些情况下,我们需要在数据框和列表之间进行转换。R 提供了 as.data.frame()
和 as.list()
函数来实现这种转换。
# 列表转换为数据框
lst <- list(
x = 1:3,
y = c("a", "b", "c")
)
df <- as.data.frame(lst)
df
# x y
# 1 1 a
# 2 2 b
# 3 3 c
# 数据框转换为列表
lst <- as.list(df)
lst
# $x
# [1] 1 2 3
#
# $y
# [1] a b c
# Levels: a b c
需要注意的是,在列表转换为数据框时,要确保列表中各元素的长度相同。而在数据框转换为列表时,每一列将成为列表中的一个元素。
2.4 常用函数和操作
2.4.1 常用数学函数
R 语言内置了许多常用的数学函数,例如:
# 绝对值
abs(-3)
# [1] 3
# 平方根
sqrt(16)
# [1] 4
# 对数
log(100) # 自然对数
# [1] 4.60517
log10(100) # 常用对数
# [1] 2
# 指数
exp(1)
# [1] 2.718282
# 三角函数
sin(pi/2) # 正弦
# [1] 1
cos(pi) # 余弦
# [1] -1
tan(pi/4) # 正切
# [1] 1
# 取整
floor(3.14) # 向下取整
# [1] 3
ceiling(3.14) # 向上取整
# [1] 4
round(3.14) # 四舍五入
# [1] 3
这些数学函数在数据分析和统计建模中非常常用,熟练掌握它们可以提高数据处理的效率。
2.4.2 统计函数
R 语言是一门统计编程语言,因此它提供了丰富的统计函数,例如:
vec <- c(1, 2, 3, 4, 5)
# 求和
sum(vec)
# [1] 15
# 均值
mean(vec)
# [1] 3
# 中位数
median(vec)
# [1] 3
# 方差
var(vec)
# [1] 2.5
# 标准差
sd(vec)
# [1] 1.581139
# 最大值
max(vec)
# [1] 5
# 最小值
min(vec)
# [1] 1
# 求和后除以长度
mean(vec) == sum(vec) / length(vec)
# [1] TRUE
这些统计函数可以快速地对数据进行汇总和描述,是数据分析的基础工具。
2.4.3 应用函数
R 语言还提供了一系列应用函数,可以对向量、列表等对象进行元素级的操作,例如:
vec <- 1:5
# 对每个元素加1
vec + 1
# [1] 2 3 4 5 6
# 对每个元素求平方
vec^2
# [1] 1 4 9 16 25
# 对每个元素应用函数
sqrt(vec)
# [1] 1.000000 1.414214 1.732051 2.000000 2.236068
lst <- list(1:3, 4:6, 7:9)
# 对列表的每个元素求和
lapply(lst, sum)
# [[1]]
# [1] 6
#
# [[2]]
# [1] 15
#
# [[3]]
# [1] 24
# 对列表的每个元素求均值
sapply(lst, mean)
# [1] 2 5 8
通过应用函数,我们可以避免显式地编写循环,从而使代码更加简洁、高效。这体现了 R 语言的函数式编程特性。
2.4.4 自定义函数
除了使用内置函数外,我们还可以根据需要自定义函数。以下是一个计算两数之和的简单函数:
# 定义函数
my_sum <- function(x, y) {
x + y
}
# 调用函数
my_sum(1, 2)
# [1] 3
my_sum(10, 20)
# [1] 30
自定义函数可以将一段重复使用的代码封装起来,提高代码的可读性和可维护性。在实际数据分析过程中,我们经常需要编写自定义函数来处理特定的任务。