R语言中数据类型和数据结构是两种不同的概念,初学者经常容易搞混,因此有必要对这两个概念进行详细说明。
1. 数据类型
R语言中的数据类型包括数值型(numeric)、整型(integer)、逻辑型(logical)、字符型(character)、复数型(complex)、原生型(raw),其他几类都比较常见,只有raw在其他语言中没有,raw是指直接使用其二进制的内容。
六种数据类型具体如下:
数据类型 | 示例 | 验证代码 | 输出结果 |
数值型 | 6.3, 4, 99.99 | v <- 23.5 ; print(class(v)); | [1] "numeric" |
整型 | 2L,0L,80L | v <- 2L ; print(class(v)); | [1] "integer" |
逻辑型 | TRUE,FALSE | v <- TRUE ; print(class(v)); | [1] "logical" |
字符型 | ‘a’,“good”,‘23.2’,“TRUE” | v <- "TRUE" ; print(class(v)); | [1] "character" |
复数型 | 5+3i | v <- 2+5i ; print(class(v)); | [1] "complex" |
原生型 | "Hello"存储值为:48 65 6c 6c 6f | v <- charToRaw("Hello"); print(class(v)); | [1] "raw" |
另外这些数据类型可以相互转换,使用as.xxx()这种的函数可以将其参数转换为对应的数据类型。
2. 数据结构
R语言中用于存储数据的对象类型称为数据结构,主要有向量、矩阵、数组、数据框和列表。
R语言中的数据结构
按照数据的维度(1D、2D、nD)和他们是同质(由相同的数据类型组成)还是异质(可以由不同的数据类型组成),可以对R语言的数据结构进行如下分类。
| 同质 | 异质 |
1D | 向量 | 列表 |
2D | 矩阵 | 数据框 |
nD | 数组 | |
2.1 向量
向量是用于存储数值型、字符型或逻辑型数据的一维数组。执行组合功能的函数c()可用来创建向量。各类向量如下例所示:
a <- c(1, 2, 5, 3, 6, -2, 4)
b <- c("one", "two", "three")
c <- c(TRUE, TRUE, TRUE, FALSE, TRUE, FALSE)
这里, a是数值型向量, b是字符型向量,而c是逻辑型向量。 注意,单个向量中的数据必须拥有相同的类型或模式(数值型、字符型或逻辑型)。同一向量中无法混杂不同模式的数据。标量是只含一个元素的向量。
2.2 矩阵
矩阵是一个二维数组,只是每个元素都拥有相同的模式(数值型、字符型或逻辑型)。可通过函数matrix()创建矩阵。一般使用格式为:
myymatrix <- matrix(vector, nrow=number_of_rows, ncol=number_of_columns, byrow=logical_value, dimnames=list(
char_vector_rownames, char_vector_colnames))
其中vector包含了矩阵的元素, nrow和ncol用以指定行和列的维数, dimnames包含了可选的、以字符型向量表示的行名和列名。选项byrow则表明矩阵应当按行填充( byrow=TRUE)还是按列填充( byrow=FALSE),默认情况下按列填充。
举例:
> y <- matrix(1:20, nrow=5, ncol=4)
> y
[,1] [,2] [,3] [,4]
[1,] 1 6 11 16
[2,] 2 7 12 17
[3,] 3 8 13 18
[4,] 4 9 14 19
[5,] 5 10 15 20
> cells <- c(1,26,24,68)
> rnames <- c("R1", "R2")
> cnames <- c("C1", "C2")
> mymatrix <- matrix(cells, nrow=2, ncol=2, byrow=TRUE,
dimnames=list(rnames, cnames))
> mymatrix
C1 C2
R1 1 26
R2 24 68
> mymatrix <- matrix(cells, nrow=2, ncol=2, byrow=FALSE,
dimnames=list(rnames, cnames))
> mymatrix
C1 C2
R1 1 24
R2 26 68
2.3 数组
数组( array)与矩阵类似,但是维度可以大于2。数组可通过array函数创建,形式如下:
myarray <- array(vector, dimensions, dimnames)
其中vector包含了数组中的数据, dimensions是一个数值型向量,给出了各个维度下标的最大值,而dimnames是可选的、各维度名称标签的列表。
举例:
> dim1 <- c("A1", "A2")
> dim2 <- c("B1", "B2", "B3")
> dim3 <- c("C1", "C2", "C3", "C4")
> z <- array(1:24, c(2, 3, 4), dimnames=list(dim1, dim2, dim3))
> z
, , C1
B1 B2 B3
A1 1 3 5
A2 2 4 6
, , C2
B1 B2 B3
A1 7 9 11
A2 8 10 12
, , C3
B1 B2 B3
A1 13 15 17
A2 14 16 18
, , C4
B1 B2 B3
A1 19 21 23
A2 20 22 24
2.4 数据框
由于不同的列可以包含不同模式(数值型、字符型等)的数据, 数据框的概念较矩阵来说更为一般。数据框可通过函数data.frame()创建:
mydata <- data.frame(col1, col2, col3,...)
其中的列向量col1、 col2、 col3等可为任何类型(如字符型、数值型或逻辑型)。每一列的名称可由函数names指定。
举例:
> patientID <- c(1, 2, 3, 4)
> age <- c(25, 34, 28, 52)
> diabetes <- c("Type1", "Type2", "Type1", "Type1")
> status <- c("Poor", "Improved", "Excellent", "Poor")
> patientdata <- data.frame(patientID, age, diabetes, status)
> patientdata
patientID age diabetes status
1 1 25 Type1 Poor
2 2 34 Type2 Improved
3 3 28 Type1 Excellent
4 4 52 Type1 Poor
每一列数据的模式必须唯一。
2.5 列表
列表( list)是R的数据类型中最为复杂的一种。一般来说, 列表就是一些对象(或成分,component)的有序集合。列表允许你整合若干(可能无关的)对象到单个对象名下。例如,某个列表中可能是若干向量、矩阵、数据框,甚至其他列表的组合。可以使用函数list()创建列表:
mylist <- list(object1, object2, ...)
举例:
> g <- "My First List"
> h <- c(25, 26, 18, 39)
> j <- matrix(1:10, nrow=5)
> k <- c("one", "two", "three")
> mylist <- list(title=g, ages=h, j, k)
> mylist
$title
[1] "My First List"
$ages
[1] 25 26 18 39
[[3]]
[,1] [,2]
[1,] 1 6
[2,] 2 7
[3,] 3 8
[4,] 4 9
[5,] 5 10
[[4]]
[1] "one" "two" "three"
> mylist[[2]]
[1] 25 26 18 39
> mylist[["ages"]]
[[1] 25 26 18 39
本例创建了一个列表,其中有四个成分:一个字符串、一个数值型向量、一个矩阵以及一个字符型向量。可以组合任意多的对象,并将它们保存为一个列表。