列表
定义
一维的、可以包含不同类型对象的数据结构
常用场景:将函数的多个返回值打包,作为一个对象返回
创建列表
list(x,y,...)
:创建列表,列表中的元素即为x,y,...。
as.list()
:将向量转换为列表。
unlist()
:将列表强制转换成向量。若列表元素不统一,则自动向下兼容到同一类型。
创建列表时为列表中的元素命名。也可以创建后再命名。
区分
[[]]
和[]
[[]]
始终是提取一个元素的内容,列表某一个成分的内容(下一级元素)
[]
始终是提取子集,列表的子集是包含若干成分的子列表(仍是同类型对象)
访问列表中的元素
法1:用$+元素名的方式访问
法2:用[[]]
访问(更灵活)
访问列表子集
用[]
访问/提取子集
对列表中的元素赋值
- 先访问,在赋值
- 可以同时给多个元素赋值
- 移除元素——将元素赋值为
NULL
常用函数
purrr包中有一系列操作列表的函数
pluck()
:同[[
,提取列表中的元素
keep()
:保留满足条件的元素
discard()
:删除满足条件的元素
compact()
:删除列表中的空元素
append()
:在列表末尾增加元素
flatten()
:摊平列表(只摊平一层)
数据框
定义
由长度相同的列向量组成的,类似于矩阵形式的的列表。
tibble与data.frame
R自带的数据框是data.frame,建议改用更现代的数据框:tibble。tidyverse 包都是基于tibble数据框。
tibble相比于data.frame的优势:
- tibble()比data.frame()做的更少:不改变输入变量的类型(R 4.0.0之前默认将字符串转化为因子!),不会改变变量名,不会创建行名
- tibble对象的列名可以是R中的“非法名”:非字母开头、包含空格,但定义和使用这样的变量时都需要用倒引号`括起来
- tibble在输出时不自动显示所有行,避免大数据框时显示很多内容
- 用
[]
选取列子集时,即使只选取一列,返回结果仍是tibble,而不自动简化为向量
下文中的命令若包含tibble,则命令中的tibble均可替换为data.frame
使用tibble需要先加载tidyverse库或tibble库
创建数据框
tibble()
:创建tibble。数据来源可以是列向量,也可以是按行录入的数据
as_tibble()
:将data.frame,matrix,多个等长度的list转换成tibble
使用names()
对数据框的各列重命名
访问数据框的元素或子集
以列表方式访问
- 用 $按列名来提取某一列的值,或者用
[[]]
按照位置或列名提取 - 用
[]
提取数据框的一列或多列,得到子数据框,其内可以是数值向量
(列位置)、字符向量(列名)、逻辑向量(是否选择各列)。
以矩阵方式访问
以列表形式操作并不支持行选择,以矩阵形式操作则可以同时支持列选择和行选择,即用[i,j]
指定行或列来提取数据框子集,[,]
其内可以是数值向量、字符向量或者逻辑向量。
若表示行的参数为空,则选择所有行
给数据框赋值
即先访问,再赋值。赋的值要和赋值的位置长度一致、格式匹配
以列表方式赋值
- 用$或
[[]]
对数据框的1列赋值 - 用
[]
访问数据框的一列或多列并对其赋值 - 利用现有的列创建(计算)新列
以矩阵方式赋值
支持同时选择列和行
转换列的类型
和转换单个元素的类型用的函数一致,只是参数那里是要转换的列
常用函数
-
str()
或glimpse()
:显示该对象的结构(可用于所有R对象) -
summary()
:生成各个列的汇总信息(还可以作用于列表,此时是显示列表中的元素的汇总信息) -
rbind()
:按行合并数据框,增加行(样本数据),要求两个数据框列数相同 -
cbind()
:按列合并数据框,增加列(属性变量),要求两个数据框行数相同
更建议用 dplyr包提供的
bind_rows()
和bind_cols()
.
-
expand.grid()
:生成多个属性的值的所有组合(即笛卡尔积)
参考资料:
《R语言编程:基于tidyverse》张敬信