文章目录
1. 向量(vector)
1.1 基本描述
即一维数组,元素必须具有相同的类型。R中下标从1开始。
1.2 创建方式
c(element1,element2,element3,...)
;1:4 = [1,2,3,4]
1.3 取值方式
- 单选:
x[1]
- 多选:
x[下标向量]
:x[c(1,4)]
、x[1:4]
x[布尔向量]
:x[c(TRUE,FALSE,TRUE)]
,其中会按照TRUE,FALSE,TRUE的模式填满x的长度。如:> x <- 1:9 # x = [1,2,3,4,5,6,7,8,9] > x[c(TRUE,FALSE,TRUE)] # 等同于 x[TRUE,FALSE,TRUE,TRUE,FALSE,TRUE,TRUE,FALSE,TRUE] 即 x[c(1,3,4,6,7,9)] [1] 1 3 4 6 7 9
- 反向选择:
x[-1]
、x[c(-1,-5)]
,下标为负数或负数向量表示取除该下标外的其他元素组成的向量
1.4 其他
- 函数
typeof()
获取到的是向量中元素的类型,而is.vector()
才能判断是否是向量:> typeof(x) [1] "integer" > is.vector(x) [1] TRUE
- 给向量命名:
names(x) <- c('a','b','c','d')
,之后就可以通过x['a']
获取该名称的元素。注意名称可以重复,此时用名称获取时就只能取到第一个匹配上的元素。 - 一个针对向量的逻辑表达式获取到的就是布尔向量:
故可以结合这种特性直接做筛选:> x <- c(1,3,4,5,6,7,8,9) > x > 5 [1] FALSE FALSE FALSE FALSE TRUE TRUE TRUE TRUE
> x <- c(1,3,4,5,6,7,8,9) > x[x>5] [1] 6 7 8 9
- 注意:R中没有真正的标量,只有一个元素的向量,如:
> a <- 1 > is.vector(a) [1] TRUE > a [1] 1 > a[1] [1] 1
2. 矩阵(matrix)
2.1 基本描述
即二维数组,其中元素必须类型一致
2.2 创建方式
matrix(
data = vector,
nrow = rowNum,
ncol = colNum,
byrow = FALSE/TRUE,
dimnames = list(rowNamesVector, rowNamesVector)
)
若data的长度小于rowNum * colNum
则循环重复填充,若大于rowNum * colNum
则截取填充。如:
> m <- matrix(data = 1:20, nrow = 4, ncol = 5, byrow = TRUE, dimnames = list(c("R1","R2","R3","R4"),c("C1","C2","C3","C4","C5")))
> m
C1 C2 C3 C4 C5
R1 1 2 3 4 5
R2 6 7 8 9 10
R3 11 12 13 14 15
R4 16 17 18 19 20
2.3 取值方式
- 选择行:
x[1,]
、x['R1',]
- 选择列:
x[,1]
、x[,'C1']
- 选择单元:
x[1,1]
、x['R1','C1']
- 多选:
x[c(1,2),1]
、x[1,c(1,2)]
、x[c('R1','R2'),'C1']
、x['R1',c('C1','C2')]
、x[c(TRUE,FALSE,TRUE),]
、x[,c(TRUE,FALSE,TRUE)]
… - 反向选择:
x[,-1]
、x[c(-1,-2),]
,下标为负数或负数向量表示取除该下标外的其他行或列组成的矩阵
2.4 其他
- 函数
typeof()
获取到的是矩阵中元素的类型,而is.matrix()
才能判断是否是矩阵:> typeof(m) [1] "integer" > is.matrix(m) [1] TRUE
- 与向量类似,一个针对矩阵的逻辑表达式获取到的就是布尔矩阵,同样可以直接进行筛选:
此处应注意筛选出的是向量,并且顺序是按列排列的。> m>5 C1 C2 C3 C4 C5 R1 FALSE FALSE FALSE FALSE FALSE R2 TRUE TRUE TRUE TRUE TRUE R3 TRUE TRUE TRUE TRUE TRUE R4 TRUE TRUE TRUE TRUE TRUE > m[m>5] [1] 6 11 16 7 12 17 8 13 18 9 14 19 10 15 20
3. 数组(array)
3.1 基本描述
即多维数组,是矩阵的扩展,其中元素必须类型一致。
3.2 创建方式
array(
data = vector,
dim = vector,
dimnames = list(dimNamesVector1, dimNamesVector2,...)
)
其中dim即为表示各个维度长度的向量。如c(2,3,4,5)
表示2*3*4*5
的4维数组。data与矩阵类似,长度不够则循环重复填充,长度超出则截断填充,而且填充按维度顺序进行,即先把第一个维度遍历填充,之后第二个维度加一,继续在第一个维度上遍历填充。如:
> arr <- array(data = 1:24, dim = c(2,3,4), dimnames = list(c('A1','A2'),c('B1','B2','B3'),c('C1','C2','C3','C4')))
> arr
, , 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
3.3 取值方式
- 选择特定一个维度:
x[1,,]
、x[,'B1',]
- 选择特定多个维度:
x[,c(TRUE,FALSE,TRUE),1]
、x['A1',,c(2,3)]
- 选择指定单元:
x[1,1,1]
、x['A1','B1','C1']
- 反向选择:
x[,-1,]
、x[c(-1,-2),,]
,下标为负数或负数向量表示取除该下标外的其他元素组成的数组
一定要注意逗号的个数,即 逗号个数 = 维度 - 1
3.4 其他
-
函数
typeof()
获取到的是数组中元素的类型,而is.array()
才能判断是否是数组:> typeof(arr) [1] "integer" > is.array(arr) [1] TRUE
此处应注意,由于矩阵就是二维的数组,故对二维的数组调用
is.matrix
返回的是TRUE
;对矩阵调用is.array
同样返回TRUE
。而不管对任何矩阵或数组,调用is.vector
均返回FALSE
。 -
与向量和矩阵类似,一个针对数组的逻辑表达式获取到的就是维度一致的布尔数组,同样可以直接进行筛选:
> arr[arr > 15] [1] 16 17 18 19 20 21 22 23 24
此处应注意筛选出的是向量,并且顺序是按列排列的。
个人小结:本质上来讲,向量(vector)、矩阵(matrix)、数组(array)都仅仅是一系列同一种类型数据的不同组织方式。在RStudio中除了矩阵,向量和数组也出现在Values列表中而不是Data列表中。可以看出R语言操作取值的方式非常灵活,尤其可以直接结合布尔表达式进行筛选。
4. 数据框(data.frame)
4.1 基本描述
类似Excel表格,其中每列数据即为一个向量,每列数据的类型可以不同,但每列数据的长度必须一致。
4.2 创建方式
data.frame(
key1 = vector1, key2 = vector2, ...,
row.names = vector(row1Name, row2Name, ...)
)
其中定义各列即通过key = value
进行,其中value即为表示该列数据的向量;key即为最后生成的数据表中,该列的名称。row.names
即为最后生成的数据表中每一行的名称。
4.3 取值方式
- 选择特定一列或多列:
df[1]
、df[c(1,2)]
、df[c(TRUE,FALSE)]
、df[c('key1','key2')]
。注意即使仅仅选择一列,这种方式选取出来的数据仍为数据框结构; - 以向量形式选择特定一列:df$key1。注意用这种方式选取的数据则为向量,即丢失了名称信息,但方便进行各种操作。
- 选择指定单元:
df[1,1]
、x['row1Name','key1']
- 反向选择:
df[,-1]
、df[c(-1,-2),]
,下标为负数或负数向量表示取除该下标外的其他元素组成的数据框
4.4 其他
- 函数
typeof()
获取到的类型为list
,因为Dataframe本质上也就是列表,详情下述。而is.data.frame()
才能判断是否是数据框> typeof(df) [1] "list" > is.data.frame(df) [1] TRUE
5. 列表(list)
5.1 基本描述
数据框dataframe要求每列数据的长度必须一致。列表list就是数据框的扩展,不要求每个成分的长度都一样,更自由也更复杂。
5.2 创建方式
list(key1 = object1, key2 = object2, ...)
其中定义列表中各个成分即通过key = value
进行,其中value可以为R中任意一种对象;key即为最后生成的列表中,该成分的名称。也可以不带有key,则各个成分的名称则从1开始按顺序命名。
5.3 取值方式
- 选择特定一个成分:
l[[1]]
、l[['key1']]
。在成分有名称时也可以使用$
进行选择,如l$key1
- 反向选择:
df[,-1]
、df[c(-1,-2),]
,下标为负数或负数向量表示取除该下标外的其他元素组成的数据框
5.4 其他
- 函数
typeof()
获取到的列表类型均为list
。因为Dataframe本质上也就是列表,故使用is.list()
判断数据框也为TRUE。并且数据框也可以通过两个方括号获取具体某列,效果与使用$
一致。> df <- data.frame(x=c(1:9),y=c(2:10), row.names = c(1:9)) > is.list(df) [1] TRUE > df[['x']] [1] 1 2 3 4 5 6 7 8 9 > df$x [1] 1 2 3 4 5 6 7 8 9