R学习笔记 第二篇:矩阵、数组和列表

向量是一维的,只有长度(行),没有其他维度。R中存在更高维度的对象,他们是矩阵,数据框,数组。这些对象的下标都是使用中括号[],第一个维度是row,第二个维度是column,依次类推,[row,column,,,]。数组是二维或多维(三维或多于三维),二维数组叫做矩阵。数组元素的类型是相同的,每个维度的元素数量是相同的。数据框是二维对象,每个数据列的数据类型是相同的,不同数据列的数据类型可以不同。

一,数组(array)

R使用arrary函数创建数组,该函数至少需要两个向量参数:数组的元素值(data)向量,和维度(dim)向量,第三个参数是可选的维度名(dimnames)向量。数据(data)参数是数组的所有元素值向量,维度参数(dim)指定各个维度的元素数量,维度名(dimnames)参数是可选的,指定各个维度的名称。

数组的维度是有顺序的,维度参数(dim)的第一个维度是row,第二个维度是column,第三个维度是high,以此类推,数组是按照维度的顺序把数据(data)参数的数据填充到数组中。

严格来说,数组(或矩阵)的长度和维度是固定的,因此不能增加或删除行或列,但可以通过为数组(或矩阵)重新赋值来实现行或列的增加或删除。

1,创建数组

示例:data=c(1:12),dim=c(2:3:2),这说明,数组共有:第一维是2行,第二维是3列,第三维是2项(item),参数dimnames为三个维度的row,column和itme命名。

复制代码
> three_d_array=array(
+     data=c(1:12),
+     dim=c(2,3,2),
+     dimnames=list(
+         c('r1','r2'),
+         c('c1','c2','c3'),
+         c('h1','h2')
+         )
+     )
复制代码

打印的结果如下,其中“ , , h1”,表示第三维的第一个item,数组按照(1,1,1),(2,1,1),(1,2,1),,的顺序填充元素值。

复制代码
, , h1
   c1 c2 c3
r1  1  3  5
r2  2  4  6

, , h2
   c1 c2 c3
r1  7  9 11
r2  8 10 12
复制代码

2,数组的维度和长度

函数dim返回数组的各个维度的长度,输出的顺序是维度的顺序

> dim(three_d_array)
[1] 2 3 2

特别地,函数nrow,ncol,用于返回数组的第一个维度,第二个维度的长度

> nrow(three_d_array)
[1] 2
> ncol(three_d_array)
[1] 3

函数length,用于返回数组的长度,是数组的各个维度的乘积:

> length(three_d_array)
[1] 12

二,矩阵(matrix)

矩阵是二维数组的特列,本质上是二维数组。使用matrix创建矩阵,必须传递的参数是数据(data)向量,行数(nrow)或列数(ncol),可选的参数是dimnames参数和byrow参数。

byrow参数的默认值是FALSE,表示按照列填充矩阵,这意味着,R首先填充第一列的所有行,再填充第二列的所有行,以此类推:

复制代码
> a_matrix=matrix(
+     data=c(1:6),
+     nrow=2,
+     byrow=FALSE,
+     dimnames = list(
+         c('r1','r2'),
+         c('c1','c2','c3')
+     )
+ )
复制代码

返回的结果如下,矩阵使用data参数,先填充位置(1,1),再填充位置(2,1),以此类推:

> a_matrix
   c1 c2 c3
r1  1  3  5
r2  2  4  6

矩阵只有两个维度,行(row)和列(column),可以使用nrow,ncol,dim函数获得矩阵各个维度的长度,可以使用length函数获得矩阵的长度,即矩阵的元素总数量。

三,索引数组和矩阵

R使用中括号[]表示索引,有四种指定索引的方法(正整数,负整数,逻辑值和元素的名称)。在不同的维度上用不同的方式指定索引下标,是有效的,每个维度的下标使用逗号分割。如果相应的维度上,下标为空,那么表示该维度的所有元素。

例如,索引数组,包含所有的行(row),第一个维度的下标是空;选择第二个维度的第1,2列,第二个维度的下标是向量c(1:2);选择第三维度的第一项(item),第三个维度的下标是1:

> three_d_array[,1:2,1]
   c1 c2
r1  1  3
r2  2  4

四,列表(list)

列表的各个item的数据类型可以不同,列表没有维度,只有元素,或项(item)。列表由list函数创建,每个参数使用逗号分割,用于指定列表的内容,列表中的元素数量不限,类型不限。不严格地说,列表是一个向量,不过,列表的元素类型可以不同。

1,创建列表

例如,创建列表,列表共有三个item,第一个item是整数向量,第二个item是字符向量,第三个item是矩阵。

> a_list=list(
+     c(1:3),
+     month.abb,
+     matrix(c(-1,-2,-3,-4),nrow=2)
+ )

打印列表,列表的第一个item,使用两个嵌套的中括号[[1]]表示,这是索引列表的一种方式:

复制代码
> a_list
[[1]]
[1] 1 2 3

[[2]]
 [1] "Jan" "Feb" "Mar" "Apr" "May" "Jun" "Jul" "Aug" "Sep" "Oct" "Nov" "Dec"

[[3]]
     [,1] [,2]
[1,]   -1   -3
[2,]   -2   -4
复制代码

2,列表的命名

使用函数names(list)为列表的每个item命名,

> names(a_list)=c('first','second','third')

也可以在创建列表时,为每个item命名,item的name是变量名,不需要加引号:

> a_list=list(
+     first=c(1:3),
+     second=month.abb,
+     third=matrix(c(-1,-2,-3,-4),nrow=2)
+ )

打印已命名的列表,每个item的名称前面都有 $ 符号,这是索引列表的一种方式:

复制代码
> a_list
$first
[1] 1 2 3

$second
 [1] "Jan" "Feb" "Mar" "Apr" "May" "Jun" "Jul" "Aug" "Sep" "Oct" "Nov" "Dec"

$third
     [,1] [,2]
[1,]   -1   -3
[2,]   -2   -4
复制代码

3,列表的长度

列表没有维度,可以使用length获取列表的长度,列表的长度是列表的item的数量:

> length(a_list)
[1] 3

4,索引列表

可以使用中括号索引列表的元素,下标有四种表示方法:正整数,负整数,元素名称或逻辑索引,例如,a_list[1:2], a_list[-3], a_list[c('first','second')], a_list[c(TURE,TRUE,FALSE)] 这四种方法返回的结果相同:

复制代码
> a_list[1:2]
$first
[1] 1 2 3

$second
 [1] "Jan" "Feb" "Mar" "Apr" "May" "Jun" "Jul" "Aug" "Sep" "Oct" "Nov" "Dec"
复制代码

这些索引操作的结果是另一个列表,这意味着,使用单个中括号,返回的是一个新的列表,要访问列表元素的内容,有两种方式:使用嵌套的中括号(传入正整数,代表列表项的下标,或传入字符串,代表列表项的名称),或指定元素的名称

例如,通过嵌套的中括号和下标,获取列表的第一个项目(item)的值:

> a_list[[1]]
[1] 1 2 3

例如,通过指定元素的名称作为下标,获取列表的第一个项目(item)的值:

> a_list$first
[1] 1 2 3

在访问列表的元素之后,可以通过中括号访问列表项的元素值,例如,列表的第一个项目是向量,通过中括号和下标,能够访问向量的第一个元素的值:

> a_list$first[1]
[1] 1
> a_list[[1]][1]
[1] 1

如果以错误的正整数索引访问列表元素的内容,R会抛出下标越界的错误,而使用错误的列表项(item)的名称,R会返回NULL值,不会报错:

> a_list[[4]]
Error in a_list[[4]] : subscript out of bounds
> a_list$forth
NULL

五,NULL值和NA值

NULL是个特殊值,表示未知值,NA表示缺失值,NULL和NA之间最大的区别是:NA是一个标量值,长度为1,而NULL不会占用任何空间,长度为零:

> length(NA)
[1] 1
> length(NULL)
[1] 0

使用is.null函数验证NULL值,使用is.na函数验证NA值:

> is.null(NULL)
[1] TRUE
> is.na(NA)
[1] TRUE

六,列表项的追加、删除和更新

列表创建之后,可以向列表中追加元素,也可以删除现有的列表元素

1,删除列表元素

NULL能够用于删除列表中的元素,把列表项设置为NULL,则会删除该列表项,在该列表项之后的元素,其索引都要减少1:

例如,把第一个列表项删除,原第二个列表项的索引变成1,原第三个列表的索引变成2:

复制代码
a_list[1]=NULL
> a_list
$second
 [1] "Jan" "Feb" "Mar" "Apr" "May" "Jun" "Jul" "Aug" "Sep" "Oct" "Nov" "Dec"

$third
     [,1] [,2]
[1,]   -1   -3
[2,]   -2   -4
复制代码

2,追加列表元素

项列表中追加新的列表项,可以使用嵌套的中括号(在列表末尾追加未命名的列表项),或直接使用新的列表项的名称(在列表末尾追加已命名的列表项):

复制代码
> a_list[[3]]=c(1:3)
> a_list$fifth=c('a','b')
> a_list
$second
 [1] "Jan" "Feb" "Mar" "Apr" "May" "Jun" "Jul" "Aug" "Sep" "Oct" "Nov" "Dec"

$third
     [,1] [,2]
[1,]   -1   -3
[2,]   -2   -4

[[3]]
[1] 1 2 3

$fifth
[1] "a" "b"
复制代码

3,列表项的更新

更新列表项,这可以通过直接访问列表项,把列表项赋值为新的变量的值来实现,例如,把列表的第三个列表项修改为list变量:

复制代码
> a_list[[3]]=list('L1','L2')
> a_list[[3]]
[[1]]
[1] "L1"

[[2]]
[1] "L2"
复制代码

七,列表和向量的相互转换

向量可以使用函数as.list函数转换成列表,所创建的列表和向量中的元素一一对应:

复制代码
> v=c(1,3)
> (l=as.list(v))
[[1]]
[1] 1

[[2]]
[1] 3
复制代码

列表既能存储相同的类型的数据,也能存储不同类型的数据,如果列表的所有列表项的数据类型相同,可以通过unlist函数把列表转换成向量:

> unlist(l)
[1] 1 3

 

 

参考文档:

R--列表

作者悦光阴
本文版权归作者和博客园所有,欢迎转载,但未经作者同意,必须保留此段声明,且在文章页面醒目位置显示原文连接,否则保留追究法律责任的权利。
分类: R
标签: R

本文转自悦光阴博客园博客,原文链接:http://www.cnblogs.com/ljhdo/p/5048622.html,如需转载请自行联系原作者
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值