本篇将总结的列表操作的一些方法。内容包括列表的基本操作、apply函数族、purrr包的map()以及rlist包。
1列表操作有难度
列表是R的一种基本数据结构,它是一个递归向量,也就是在每个元素中可以包含另一个向量或列表的向量。
列表是R中最灵活的数据结构之一,因为它可以容纳异质元素。一个列表可以包含多个元素,这些元素可以有各自的类型,可以包含嵌套,甚至可以创建列表的列表的列表...。(列表是个筐,什么都可以装,列表甚至可以“伪装”成模型对象、数据框、数据框的列表列等等看起来各不相同的数据结构)。同时,列表也是R中最常用的数据结构的之一,是用来表示非结构化数据的基本数据结构。非结构化数据是指数据结构不规则或不完整,没有预定义的数据模型,不方便用数据库二维逻辑表来表现的数据,包括文本、图片、XML,HTML、各类报表、图像和音频/视频信息等等。比如,在使用R进行网络抓取时,JSON数据就解析成列表。
在很多R图书里,列表(相对于向量、数据框甚至矩阵)的讲解是很不充分的。这一点与列表在实际应用中的重要性和复杂性不相称。原因可能在于,传统的数据分析方法往往基于结构整齐、可以放入表格处理的结构化数据,对非结构化数据的重视不够。因此baseR当中的列表基本操作处理复杂列表是很吃力的。而且,非结构化数据的实例又往往过于复杂,不太容易在基础类型的图书中展开讲解。
本篇将总结的列表操作的一些方法。内容包括列表的基本操作、apply函数族、purrr包的map()以及rlist包。本篇只讨论列表,与列表有关的更复杂的内容,比如JSON、列表列,或者purrr包的详细功能,以后会分别专门讨论。
1-1列表示例
使用函数list()可以创建一个列表,通过函数str()可以查看这个列表的结构:
list1-list(a=1:5,b=c(2.5,8,0.3),c="helloworld",d=c(TRUE,TRUE,FALSE))str(list1)#Listof4#a:int[1:5]#b:num[1:3]2..3#c:chr"helloworld"#d:logi[1:3]TRUETRUEFALSE
列表可以有更复杂的形式,R包repurrrsive给出了一些复杂列表的示例,其中数据集got_chars是美剧《权利的游戏》(前六季)中的30个角色的列表,每一个角色又包含了18个列表,对应着角色的一些信息。如果用str()展示整个列表的结构,会给出非常冗长的结果。这时候可以用R包listviewer,可以交互查看列表的结构,也可以在RStudio中使用View()获得类似的结果。
library(repurrrsive)library(tidyverse)str(got_chars[[1]])###got_chars每个子列表的结构相同#Listof18#url:chr"