R语言中包括哪些数据结构?( 二 )


> levels(sex.f)[1] "Male""Female"在统计模型中,对于因子型变量,R会将其第一个水平当作参考组 。很多时候我们需要改变因子水平的排列顺序以改变参考组,这可以通过两种方法实现 。第一种方法是在函数factor( )中改变参数levels和labels的排列顺序,例如:
> sex.f1 <- factor(sex, levels = c(2, 1), labels = c("Female", "Male"))> sex.f1[1] MaleFemale MaleMaleFemale MaleFemaleLevels: Female Male第二种方法是使用函数relevel( ):
> sex.f1 <- relevel(sex.f, ref = "Female")> sex.f1[1] MaleFemale MaleMaleFemale MaleFemaleLevels: Female Male要表示有序因子,需要在函数factor( )里指定参数ordered = TRUE 。例如:
> status <- c(1, 2, 2, 3, 1, 2, 2)> status.f <- factor(status,levels = c(1, 2, 3),labels = c("Poor", "Improved", "Excellent"),ordered = TRUE)> status.f[1] PoorImprovedImprovedExcellentPoorImprovedImproved Levels: Poor < Improved < Excellent2.1.3 矩阵矩阵(matrix)是一个由行和列组成的二维数组 。矩阵里的每个元素具有相同的模式(数值型、字符型或逻辑型) 。在大多数情况下,矩阵里的元素是数值型的,它具有很多数学特性和运算方式,可以用来进行统计计算,例如因子分析、广义线性模型等 。函数 matrix( )常用于创建矩阵,例如:
> M <- matrix(1:6, nrow = 2)> M[,1] [,2] [,3][1,]135[2,]246上面的命令用向量1到6创建了一个行数为2的矩阵,R会根据向量的长度和参数nrow设定的行数自动计算列数 。参数byrow默认为FALSE,即按列将数值进行排列,如果需要按行排列,只需将参数byrow设为TRUE 。
常见的矩阵运算都可以在R中实现,如矩阵加法、矩阵乘法、求逆矩阵、矩阵转置、求方阵的行列式、求方阵的特征值和特征向量等 。
矩阵乘法中要求第一个矩阵的列数等于第二个矩阵的行数,其运算符为“%*%” 。先创建两个矩阵:
> mat1 <- matrix(1:6, nrow = 3)> mat1[,1] [,2][1,]14[2,]25[3,]36> mat2 <- matrix(5:10, nrow = 2)> mat2[,1] [,2] [,3][1,]579[2,]6810函数dim( )可以得到矩阵的维数,即行数和列数:
> dim(mat1)[1] 3 2> dim(mat2)[1] 2 3结果表明,mat1是一个3行2列的矩阵,mat2是一个2行3列的矩阵,因此它们可以相乘,结果应该是一个3行3列的矩阵 。
> mat1 %*% mat2[,1] [,2] [,3][1,]293949[2,]405468[3,]516987矩阵的转置运算就是把矩阵的行和列互换 。例如,求矩阵mat1的转置矩阵:
> t(mat1)[,1] [,2] [,3][1,]123[2,]456求方阵的行列式和逆矩阵分别可以使用函数det( )和函数solve( )实现,例如:
> mat3 <- matrix(1:4, nrow = 2)> det(mat3)[1] -2> solve(mat3)[,1] [,2][1,]-21.5[2,]1 -0.5此外,我们还可以对矩阵按行、列求和或者求平均,例如:
> rowSums(mat1)[1] 5 7 9> colSums(mat1)[1]6 15> rowMeans(mat1)[1] 2.5 3.5 4.5> colMeans(mat1)[1] 2 5与矩阵运算有关的函数在此无法一一详述,读者有需要时可以通过查阅CRAN的相关文档了解更多矩阵运算函数用法的细节 。
使用索引访问矩阵元素也是矩阵的基本操作,与向量类似,我们可以用“[]”来索引访问矩阵中的元素 。不同的是,对于矩阵,在“[ ]”中需要用逗号分隔行号和列号 。例如,选取矩阵mat1的前两行和前两列,可以使用下面的命令:
> mat1[1:2, 1:2][,1] [,2][1,]14[2,]25如果省略了行号或列号,则表示选取所有行或者所有列,例如:
> mat1[2:3,][,1] [,2][1,]25[2,]362.1.4 数组通常所说的数组(array)指的是多维数组,它与矩阵类似,但是维数大于2 。数组有一个特殊的维数(dim)属性 。下面的命令给一个向量加上维数后定义了一个数组,请注意数值的排列顺序 。
> A <- 1:24> dim(A) <- c(3, 4, 2)> A, , 1[,1] [,2] [,3] [,4][1,]14710[2,]25811[3,]36912, , 2[,1] [,2] [,3] [,4][1,]13161922[2,]14172023[3,]15182124上面的数组还可以通过函数array( )创建,并给各个维度添加名称和标签 。
> dim1 <- c("A1", "A2", "A3")> dim2 <- c("B1", "B2", "B3", "B4")> dim3 <- c("C1", "C2")> array(1:24, dim = c(3, 4, 2), dimnames = list(dim1, dim2, dim3)), , C1B1 B2 B3 B4A1 147 10A2 258 11A3 369 12, , C2B1 B2 B3 B4A1 13 16 19 22A2 14 17 20 23A3 15 18 21 242.1.5 列表列表(list)是R中最灵活也最复杂的一种数据结构,它可以由不同类型的对象混合组成 。例如,它可以是向量、数组、表格和任意类型对象的组合 。


推荐阅读