R语言学习 第七篇:列表
列表(List)是R中最复杂的数据类型,一般来说,列表是数据对象的有序集合,但是,列表的各个元素(item)的数据类型可以不同,每个元素的长度可以不同,是R中最灵活的数据类型。列表项可以是列表类型,因此,列表被认为是递归变量,与之相对,向量,数组,矩阵,数据框被认为是原子变量。
一,创建列表
列表由list()函数创建,每个参数使用逗号分割,用于指定列表项的内容,列表中的元素数量不限,类型不限。列表项的名称是可选的,可以创建无名的列表项;列表的每一个item,都可以显示命名,例如,name1=item1, name2=item2。
list([name1=]item1,[name2=]item2,...)
1,创建的无名的列表项
例如,下面的脚本创建一个列表,该列表共有三个item,第一个item是整数向量,第二个item是字符向量,第三个item是矩阵,列表的每一个item都没有名称;对于无名的列表项,只能通过嵌套的中括号[[n]]来索引列表项的元素:
> 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,创建命名的列表项
通过指定列表项的变量名,为每一个列表项显示指定名称,列表项的命名是变量名,不需要加双引号;对于列表中的命名元素,可以使用美元符号$来索引列表项。
> a_list <- list(
+ a=c(:),
+ b=month.abb,
+ c=matrix(c(-,-,-,-),nrow=)
+ )
> a_list
$a
[] $b
[] "Jan" "Feb" "Mar" "Apr" "May" "Jun" "Jul" "Aug" "Sep" "Oct" "Nov" "Dec" $c
[,] [,]
[,] - -
[,] - -
二,列表元素的命名
使用函数names(list)查看列表中每个item的名称,如果创建列表是无名列表项,那么该函数返回NULL;可以对该函数names(list)赋值,为列表的每个item命名:
> names(a_list) <- c('first','second','third')
> a_list
$first
[] $second
[] "Jan" "Feb" "Mar" "Apr" "May" "Jun" "Jul" "Aug" "Sep" "Oct" "Nov" "Dec" $third
[,] [,]
[,] - -
[,] - - > names(a_list)
[] "first" "second" "third"
三,列表的长度
列表没有维度,列表和向量一样,有长度(length),可以使用函数length()获取列表的长度,列表的长度是列表的顶层item的数量,不包括嵌套的列表项。
> length(a_list)
[1] 3
函数NROW(),NCOL()把列表看作向量,是只有一列,多行的数据结构,因此NCOL(x)始终返回1,而NROW(x)返回的值和length(x)相同
> NCOL(a_list)
[]
> NROW(a_list)
[]
四,索引列表
列表的下标是列表项的序号,可以使用中括号[n]索引列表的元素,下标有四种表示方法:正整数、负整数、元素名称或逻辑索引,下标的整数值从1开始,正整数表示选择该列表项,负整数表示剔除该列表项。
例如,选择列表的第1项,第2项,分别使用正整数下标、负整数下标、元素名称和逻辑索引表示:
> a_list[:]
> a_list[-]
> a_list[c('first','second')]
> a_list[c(TURE,TRUE,FALSE)] $first
[] $second
[] "Jan" "Feb" "Mar" "Apr" "May" "Jun" "Jul" "Aug" "Sep" "Oct" "Nov" "Dec"
这些索引操作的结果是产生另一个列表,也就是说,使用单个中括号索引列表项,返回的结果是一个新的列表,要访问列表元素的内容,有两种方式:使用嵌套的中括号(传入正整数,代表列表项的下标,或传入字符串,代表列表项的名称),或指定元素的名称。
1,使用嵌套的中括号
例如,通过嵌套的中括号和下标,获取列表的第一个项目(item)的值:
> a_list[[1]]
[1] 1 2 3
2,使用列表的名称
例如,通过指定元素的名称作为下标,获取列表的第一个项目(item)的值:
> a_list$first
[1] 1 2 3
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值。
1,删除列表元素
NULL是各特殊值,表示一个空的变量,不会占用任何空间,长度为零。NULL能够用于删除列表中的元素,把列表项更新为NULL,则R会删除该列表项,在该列表项之后的元素,其索引序号都要减少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[[]]=c(:)
> a_list$fifth=c('a','b')
由于通过单层中括号索引的列表项是一个列表,也可以为直接通过列表变量赋值:
> a_list[] <- list(c(:))
> a_list["fifth"] <- list(c('a','b'))
3,列表项的更新
更新列表项,可以通过直接访问列表项,把列表项赋值为新的变量来实现,
例如,把列表的第三个列表项修改为list类型的变量:
> a_list["forth"] <- list(c('L1','L2'))
> a_list$"forth"
[] "L1" "L2"
4,更新列表项的元素
索引列表项的元素,改变元素的值:
> a_list$"forth"[] <- "L3"
> a_list$forth
[] "L1" "L2" "L3"
5,把列表项更新为NULL值
要把现有的列表元素设置为NULL值,不能简单地为其赋值为NULL,因为这将删除该列表元素,而是必须使用list(NULL)来设置,list(NULL)返回的是空的列表:
a_list[] <- list(NULL)
六,列表和向量的相互转换
向量可以使用函数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中,函数只是另一种数据类型的变量,可以被分配,操作,甚至把函数作为参数传递给其他函数.分支控制和循环控制,和通用编程语言的风格很相似, ...
- R语言学习 第五篇:字符串操作
文本数据存储在字符向量中,字符向量的每个元素都是字符串,而非单独的字符.在R中,可以使用双引号,或单引号表示字符. 一,字符串中的字符数量 函数nchar()用于获得字符串中的字符数量: > s ...
- R语言学习 第八篇:常用的数据处理函数
Basic包是R语言预装的开发包,包含了常用的数据处理函数,可以对数据进行简单地清理和转换,也可以在使用其他转换函数之前,对数据进行预处理,必须熟练掌握常用的数据处理函数,本文分享在数据处理时,经常使 ...
- R语言学习 第十篇:操作符
运算符是R语言中最基础的存在,熟悉运算符的使用,是熟练使用R处理数据的基础,操作符,顾名思义,是对数据进行运算的符号,R有自己的一套操作符,实现变量的赋值,引用,运算等功能. 一,赋值符号 为变量赋值 ...
- R语言学习 第十一篇:日期和时间
R语言的基础包中提供了三种基本类型用于处理日期和时间,Date用于处理日期,它不包括时间和时区信息:POSIXct/POSIXlt用于处理日期和时间,其中包括了日期.时间和时区信息.R内部在存储日期和 ...
- R语言学习 第三篇:数据框
数据框(data.frame)是最常用的数据结构,用于存储二维表(即关系表)的数据,每一列存储的数据类型必须相同,不同数据列的数据类型可以相同,也可以不同,但是每列的行数(长度)必须相同.数据框的每列 ...
- R语言学习 第十篇:包
包(Package)是实现特定功能的.预先写好的代码库(library),通俗地说,包是含有函数.数据等的功能模块.R拥有大量的软件包,许多包都是由某一领域的专家编写的,但并不是所有的包都有很高的质量 ...
- C语言学习 第七次作业总结
C语言学习 第七次作业总结 数组可以分为数组和多下标数组(在传统的国内C语言书本中,将其称为二/多维数组). 数组名称 在之前的课程中,大家应该都有印象,对于int a这样的定义,会为变量 a 声明一 ...
- Go语言学习笔记七: 函数
Go语言学习笔记七: 函数 Go语言有函数还有方法,神奇不.这有点像python了. 函数定义 func function_name( [parameter list] ) [return_types ...
随机推荐
- BZOJ 3270: 博物馆 [概率DP 高斯消元]
http://www.lydsy.com/JudgeOnline/problem.php?id=3270 题意:一张无向图,一开始两人分别在$x$和$y$,每一分钟在点$i$不走的概率为$p[i]$, ...
- vue 使用Jade模板写html,stylus写css
vue 使用Jade模板写html,stylus写css 日常工作都是使用vue开发页面和webApp,写的多了就想偷懒简化各种书写方式,所以使用了jade写html,stylus写css,省了很多的 ...
- 【Tools】Pycharm 2018专业版 linux安装教程 附2018专业版密钥
Linux安装pycharm2018专业版 1. 下载安装包 Pycharm下载地址:http://www.jetbrains.com/pycharm/download/ 2.终端打开你的安装包所在路 ...
- java生产者与消费者模式
前言: 生产者和消费者模式是我们在学习多线程中很经典的一个模式,它主要分为生产者和消费者,分别是两个线程, 目录 一:生产者和消费者模式简介 二:生产者和消费者模式的实现 声明:本例来源于java经典 ...
- Android 文件下载三种基本方式
一.自己封装URLConnection 连接请求类 public void downloadFile1() { try{ //下载路径,如果路径无效了,可换成你的下载路径 String url = & ...
- Linux-PATH_环境变量
PATH变量 是linux系统里的一个环境变量,系统已经定义好了,我们不需要再定义. 作用: 是linux里使用的命令都存在在PATH变量后面指定的目录下,我们使用命令 ...
- JVM中对象访问定位两种方式
1.通过句柄方式访问, 在Java堆中分出一块内存进行存储句柄池,这样的话,在栈中存储的是句柄的地址 优点: 当对象移动的时候(垃圾回收的时候移动很普遍),这样值需要改变句柄中的指针,但是栈中的指针不 ...
- LeetCode第七天
==数组 Medium== 40.(162)Find Peak Element JAVA //斜率思想,二分法 class Solution { public int findPeakElement( ...
- 如何在 window7 环境编译 zlib 库?
1.下载最新版本 zlib 库 `下载地址:http://www.zlib.net/ 2.打开vc14项目 解压下载的 zlib.zip 压缩包并打开zlib1211\zlib-1.2.11\cont ...
- Java文件及文件夹的创建与删除
功能 这个实例实现了在D盘创建一个文件和文件夹,并删除它们. 函数介绍 createNewFile():当文件不存在时,根据绝对路径创建该文件. delete():删除文件或者文件夹. ...