当前课程知识点:R语言数据分析 > 中部:执具 > 第7章 数据对象——面向数据对象学习R语言 > 7.5 列表与数据框(I)
大家好
欢迎来到《R原数据分析》课程
今天咱们简单交流一下
列表与数据框相关内容
还是先回到我们的数据对象的这个地图
在R里面需要重点掌握的 (数据对象)有三组六类
在前面课程里面
将前面两组向量因子以及矩阵数组
进行了简单的交流
从今天开始
咱们进入第三组
先我们看一看这个列表相关的内容
列表其实就是一个集合
其实我们前面讲所有的数据对象
它其实都是一种集合
除了我们最基本的比如说字符数值之外
它其实都是如何将这些最基本的元素组织起来
变成一个集合
当然我们在前面讲
比如说矩阵的时候
它在组织的时候对这个元素本身是有要求的
比如我要将不同的向量
把它变成一个矩阵的时候
要求这个不同的向量
它的类型必须是一样的
并且长度是一样的
而对列表来讲
它其实也是对象的有序集合
但是它对这个所组成的部分没有任何要求
就是我所组成的对象可以是不同的类型
也可以是不同长度的
所以我们说列表是最为灵活
最具有包容性的这么一种数据结构
它具体来讲
我们可以用这么一个形象的图来表达它
就是这是一个列表的话
它有不同的组成部分
我们可以通过这个美元符号$把它连接起来
比如说第一部分 第二部分 第三部分 第四部分
就有不同的组成部分
每个组成部分可以是不同的类型的
长度也可以不同
咱们看看R里面具体如何实现它
比如说我们现在拿到了
有关北京邮电大学的一些相关信息
首先是我们通过一个字符向量
比如说总共是长度为17的一个字符向量
将我们北邮的每一个学院的名称
我们存储起来就是学院的名称
第一个字符向量
然后北邮有国家重点实验室有2个
有工程实验室有5个
省部级实验室有9个
那好这时候我们把它存储为一个
带名称的这个数值向量
就这个基地
我们作为科研基地存储起来
然后北邮的校区
比如说有西土城校区
有沙河校区
有沙河校区
有宏福校区
这个时候我还是把它作为
一个字符向量存储起来
放到xiao_qu这么一个变量里面
比如说还有就是关于这个学生的数量的情况
全日制有30000
非全日制有45000
这也是一个带名称的一个数值向量
好 我们可以看得出来
这里面它其实有不同的类型
有字符的有数值的
它长度也不一样
但是因为它是都是关于北京邮电大学相关信息
这个时候我想把它捏成一个整体怎么办
这时候我就可以把它变成
变成一个列表
捏成一个整体其实就把它集合在一起
这个列表的话
我们创建这个列表
就调用这个list()这个函数
其实和我们前面讲到的比如向量也好
因子也好 矩阵也好
比如说c()
factor()
包括我们这边讲的list()
都是一样的都通过调用某个函数
然后以赋值的方式来创建相应的列表
具体来讲
比如说我列表现在有1234有四个组成部分
我第一个组成部分设置为前面的学院
第二个组成部分是校区
第三个组成部分是基地
第四个组成部分是学生数量
当然我们这个并不表示这两个名称必须一样
这个是我们已经创建好的一个学院
这么一个字符向量你前面可以写成
xy = xue_yuan
表示我第一个组成部分的名称是
xue_yuan或者是xy
一旦创建完之后
我们可以怎么样
可以看看它一些最基本的属性
比如说我可以看看这个bupt
我们刚才创建好这个列表
它有几个组成部分
我们一看
调这个length()这么一个函数
可以发现它有四个组成部分
每个组成部分什么名称
调names这个函数
分别是xue_yuan
xiao_qu
ji_di
xue_sheng
再看看这个内部怎么存储的
(调用) typeof(bupt)
发现它是一个列表
这已经就
通过调用这么个list()函数
我们就完成了这个列表的一个创建的工作
创建完表之后
我们看看我如何来访问这个列表的子集
访问列表子集
一个非常通用的方法是
通过这美元符号
$符号
比如说我想访问第四个组成部分
这个学生数量
就bupt是我们前面这个创建好的这个列表
用$符号连接它的组成部分的名称
bupt里面的xue_sheng
这时候我们可以看出来
就将我们这个带名称的这个数值向量提取出来
一旦提取出来之后
就像我们通常一个数值向量一个访问方式一样
比如说我可以怎么样
我可以提取其中某一个元素
我将全日制按照名称的方式来取它的
组成部分取这个向量的子集
当然也可以比如说我将这个向量
将全日制和非全日制相加
sum()一下
发现总共北邮的学生是75000
这是我们的列表里面
总那个访问子集的一个非常通用的方式
当然我们前面在讲这个向量因子
包括矩阵的时候都用访问子集的话
都用方括号[]
那对这个列表来讲是不是也可以这样
列表也可以借助这个方括号来访问它
比如说我们现在是bupt[4]
表示我提取这个列表的第四个组成部分
我们一看 这一部分是
我们前面看到的这个带名称的数值向量
但是大家注意了
这里面第一行是$`xue_sheng`
表示我提取的这个组成部分还是个列表
这是非常需要注意的
就我们现在假如我们调用这个typeof()
bupt[4]
它其实现在得到的不是一个数值向量
它类型并不是double
它还是个列表 (通用法则:子集X[]的类型与X相同)
也就什么意思
这个时候我单个的方括号
它看到的依然是这个包装箱
说白了 就是将我将不同的组成部分
捏成一个整体的时候
相当于每一个组成部分我都打了一个包
单个的方括号其实只是定位到这个包装箱而已
还没有进入包装箱内部
假如进入包装箱内部的话怎么进入
两个方括号就可以
双层的方括号
注意了
这是和我们前面的这个向量因子
包括矩阵等等都不一样的地方
就在访问列表的时候
一定是两个方括号才进入到包装箱内部
才能提取出你这个组成部分本身
这时候我们一看就是全日制非全日制
这个带名称的数字向量
我们再调用这个typeof()
就发现这个bupt这个双层的方括号
所得结果就是double了
这个就是我们这个组成部分本身
我们一旦理解了这个单层的方括号
和双层方括号的区别的时候
我们看下面这个相应的语句
比如说sum(bupt[4])
那这个时候会出错
因为我目前得到的只是一个列表
还是那个包装箱上面
没有进入到里边去
所以说这个时候sum()是不可能的
假如我真正要什么
我要将这个全日制和非全日制
将北邮的学生总数求出来的话
怎么办
必然是双层的方括号
好 用这个方括号的时候
除了这个正整数之外
还可以用
像我们前面的那个向量因子等等一样
其实也可以通过名称来访问也可以
比如说bupt["xue_sheng"]
这个时候只是达到第四个组成部分
假如双重的方括号的话再xue_sheng的话
就进入到这个包装箱内部去了
还是拿到了取得这个组成部分本身
咱们总结一下
要访问列表子集的话下面这三种方式
效果是相同的
第一种就用这个$美元符号
可以
就是列表的名称接上它的组成部分的名称
第二种用双重的方括号
双重方括号里面可以放正整数
你是第几个组成部分
当然第三种是就将这个
通过这个名称来访问也是一样的
它得到结果都是我们进入到包装箱内部
将它这个组成部分本身取出来了
这是列表子集的一些访问的方式
那我们也有可能要
对这个列表的一些组成部分进行修改
比如说我们经过这个学科评估
发现北邮有三个学科是A类学科
那这个时候我要增加一部分的话怎么办
直接赋值注意了
要增加列表的相应的组成部分的时候
直接赋值就可以
这就和我们创建的列表的方式是一样的
我就当它有这么一个组成部分
我直接赋给它
然后自然就新增了一部分
简单直接
这时候我们再看看
bupt它有几个组成部分
由刚才的四个组成部分变成了五个
你再要调用names()这个函数的时候
发现最后一个组成部分名称也是新增加进来了
假如我要删除的话怎么删除
删除其中某个组成部分
我直接将这个NULL赋给它就可以
就是空将它赋完之后
重新我们调研这个names(bupt)
发现它又变回到原来的四个组成部分
这就是我们关于这个列表的更改
其实就是赋值
其实我们在看完这些语句之后
也可以总结一下
就是在R里面关于不同数据对象创建我是赋值
关于不同数据对象的修改
我是赋值
然后第里面不同组成部分增加或删除怎么样
还是赋值
所以赋值是一个非常非常常见的操作
好 这是我们关于这个列表如何更改它相应的元素
当然我们前面
讲到矩阵的时候就讲到一个apply()函数族
相应的在列表里面这个apply函数族是什么
我们要用到lapply
这个l的话表示意思
就是对列表对这个list
它的每个组成部分做相应的操作
应用相应的函数
比如对bupt这个列表
我用一个函数
我求一求它每一个组成部分长度
我们看得出来
它返回的还是一个列表
就是列表每个组成部分
它相应的结果
比如说这个学院
我们有17个
然后校区有3个
基地三种类型然后学生的数量
它有两种类型
一个全日制是一个非全日制
当然我们一看这里面有17 3 3 2
我们想一下
这个用列表的方式来讲好像不是特别直观
那这时候怎么办
我可以将这个返回的结果再怎么样unlist()
unlist()就将它拉平
拉成一个带名称的数值向量就可以
比如说我们将刚才这个结果
刚才这个以列表方式存在的结果返回结果
我怎么样unlist()
这个时候就变成一个
拉平了之后的一个带名称的数字向量了
当然这两步也可以并成一步
什么意思
我就将这个lapply
改成sapply表示
s表示什么意思simple
就是假如我返回结果
每一个列表的每个组成部分
它最后的结果都是单个元素的话
我要想要变成一个向量
我直接调用sapply
这时候我们一看它返回结果
就是一个带名称的数值向量了
列表的每一个组成部分的名称
是它这个新的这个返回结果
这个数值向量的名称
当然我们可以应用于其它的一些函数
比如说typeof可以查一下
看一看我们列表的每个组成部分
它是一种什么样的数据类型
比如前两种是一个字符型的
基地和学生数量都是这个数值型的
这后面两种都是数值型的
这就是我们关于这个列表的一些最基本的操作
当然虽然我们说列表是一个非常灵活数据结构
但其实它操作起来其实还是相对比较简单的
我们在后续的课程里面
比如讲到算法模型的时候会发现
其实我们后面建模的结果
也是以这个列表方式存在
在具体的后面做数据分析的时候
我们再重新温习的时候
可能对这个列表有更深刻的理解
本次课到此结束
谢谢大家
-第1章 气象万千、数以等观
--第1章 作业
-第2章 所谓学习、归类而已
--第2章 作业
-第3章 格言联璧话学习
--第3章 作业
-第4章 源于数学、归于工程
--第4章 作业
-讨论题
-第5章 工欲善其事、必先利其器
--第5章 作业
-第6章 基础编程——用别人的包和函数讲述自己的故事
--6.1 编程环境
--6.4 控制流
--第6章 作业
-第7章 数据对象——面向数据对象学习R语言
--第7章 作业
-第8章 人人都爱tidyverse
--第8章 作业
-第9章 最美不过数据框
--第9章 作业
-第10章 观数以形
--第10章 作业
-第11章 相随相伴、谓之关联
--11.1 导引
--第11章 作业
-第12章 既是世间法、自当有分别
--12.1 导引
--第12章 作业
-第13章 方以类聚、物以群分
--13.1 导引
--第13章 作业
-第14章 庐山烟雨浙江潮
--第14章 作业