R语言笔记【一】:基本数据结构

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
    
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值