北京大学R语言教程(李东风)第11章:列表类型

R中列表(list)类型来保存不同类型的数据。
一个主要目的是提供R分析结果输出包装:
输出一个变量,
这个变量包括回归系数、预测值、残差、检验结果等等一系列不能放到规则形状数据结构中的内容。
实际上,数据框也是列表的一种,
但是数据框要求各列等长,
而列表不要求。

列表可以有多个元素,
但是与向量不同的是,
列表的不同元素的类型可以不同,
比如,
一个元素是数值型向量,
一个元素是字符串,
一个元素是标量,
一个元素是另一个列表。

定义列表用函数list(), 如

rec <- list(name="李明", age=30,
  scores=c(85, 76, 90))
rec
## $name
## [1] "李明"
## 
## $age
## [1] 30
## 
## $scores
## [1] 85 76 90

typeof()函数判断一个列表,
返回结果为list
可以用is.list()函数判断某个对象是否列表类型

为了生成元素为空的长度为n的列表,程序如:

11.2 列表元素访问

列表的一个元素也可以称为列表的一个“变量”,
单个列表元素必须用两重方括号格式访问,如

rec[[3]]
## [1] 85 76 90
rec[[3]][2]
## [1] 76
rec[["age"]]
## [1] 30

列表的单个元素也可以用$格式访问,如

如果使用单重方括号对列表取子集,
结果还是列表而不是列表元素,如

rec[3]
## $scores
## [1] 85 76 90
is.list(rec[3])
## [1] TRUE

列表一般都应该有元素名,
元素名可以看成是变量名,
列表中的每个元素看成一个变量。
names()函数查看和修改元素名。

names(rec)
## [1] "name"   "age"    "scores"
names(rec)[names(rec)=="scores"] <- "三科分数"
names(rec)
## [1] "name"     "age"      "三科分数"
rec[["三科分数"]]
## [1] 85 76 90

可以修改列表元素内容。

rec[["三科分数"]][2] <- 0
print(rec)
## $name
## [1] "李明"
## 
## $age
## [1] 30
## 
## $三科分数
## [1] 85  0 90

直接给列表不存在的元素名定义元素值就添加了新元素,
而且不同于使用向量,对于列表而言这是很正常的做法,比如

rec[["身高"]] <- 178
print(rec)
## $name
## [1] "李明"
## 
## $age
## [1] 30
## 
## $三科分数
## [1] 85  0 90
## 
## $身高
## [1] 178

把某个列表元素赋值为NULL就删掉这个元素。

rec[["age"]] <- NULL
print(rec)
## $name
## [1] "李明"
## 
## $三科分数
## [1] 85  0 90
## 
## $身高
## [1] 178

list()函数中允许定义元素为NULL,这样的元素是存在的,如:

li <- list(a=120, b="F", c=NULL); li
## $a
## [1] 120
## 
## $b
## [1] "F"
## 
## $c
## NULL

但是,要把已经存在的元素修改为NULL值而不是删除此元素,
或者给列表增加一个取值为NULL的元素,
这时需要用单重的方括号取子集,
这样的子集会保持其列表类型,
给这样的子列表赋值为list(NULL),如:

li["b"] <- list(NULL)
li["d"] <- list(NULL)
li
## $a
## [1] 120
## 
## $b
## NULL
## 
## $c
## NULL
## 
## $d
## NULL

11.3 列表类型转换

as.list()把一个其它类型的对象转换成列表;
unlist()函数把列表转换成基本向量。如

li1 <- as.list(1:3)
li1
## [[1]]
## [1] 1
## 
## [[2]]
## [1] 2
## 
## [[3]]
## [1] 3
li2 <- list(x=1, y=c(2,3))
unlist(li2)
##  x y1 y2 
##  1  2  3

11.4 连接列表

两个列表可以用c连接成一个列表,
如:

li1 <- list(1:2)
li2 <- list(11:12)
li <- c(li1, li2)
li
## [[1]]
## [1] 1 2
## 
## [[2]]
## [1] 11 12

如下的做法没有达到目的:

li <- list()
li <- c(li, 1:3)
li <- c(li, 11:13)
li
## [[1]]
## [1] 1
## 
## [[2]]
## [1] 2
## 
## [[3]]
## [1] 3
## 
## [[4]]
## [1] 11
## 
## [[5]]
## [1] 12
## 
## [[6]]
## [1] 13

需要改为:

li <- list()
li <- c(li, list(1:3))
li <- c(li, list(11:13))
li
## [[1]]
## [1] 1 2 3
## 
## [[2]]
## [1] 11 12 13

11.5 返回列表的函数示例–strsplit()

strsplit()输入一个字符型向量并指定一个分隔符,
返回一个项数与字符型向量元素个数相同的列表,
列表每项对应于字符型向量中一个元素的拆分结果。

x <- c("10, 8, 7", "5, 2, 2", "3, 7, 8", "8, 8, 9")
res <- strsplit(x, ","); res
## [[1]]
## [1] "10" " 8" " 7"
## 
## [[2]]
## [1] "5"  " 2" " 2"
## 
## [[3]]
## [1] "3"  " 7" " 8"
## 
## [[4]]
## [1] "8"  " 8" " 9"

为了把拆分结果进一步转换成一个数值型矩阵,
可以使用sapply()函数如下:

t(sapply(res, as.numeric))
##      [,1] [,2] [,3]
## [1,]   10    8    7
## [2,]    5    2    2
## [3,]    3    7    8
## [4,]    8    8    9

sapply()函数是apply类函数之一,
稍后再详细进行讲解。

韭菜热线原创版权所有,发布者:风生水起,转载请注明出处:https://www.9crx.com/77953.html

(0)
打赏
风生水起的头像风生水起普通用户
上一篇 2023年10月30日 01:56
下一篇 2023年10月31日 00:16

相关推荐

  • 如何设定明智的财务目标?具体、可衡量、可实现、相关、有时限

    在迈向财务成功的旅程中,设定清晰有效的目标至关重要。SMART 框架是“具体”、“可衡量”、“可实现”、“相关”和“有时限”的缩写,它提供了一种结构化的目标设定方法,可以显著增强您的财务规划工作。我们将深入研究 SMART 框架的每个要素,并探讨它如何帮助您做出明智的决策、保持专注并实现您期望的财务里程碑。 ‍ ‍ 1. 具体目标:清晰是关键 ‍ 创建 SM…

    2023年11月29日
    14600
  • 复利,您金钱最好的朋友

    复利听起来很奇特。在财务规划领域,我们经常谈论如何通过高收益储蓄账户或投资来赚取利息,从而在您尝试增加财富时改变游戏规则。尽管复利可能看起来很复杂或难以实现,但事实是,如果您现在开始储蓄,任何人都可以利用它的好处。 复利如何运作? 复利实际上比大多数人意识到的更简单。我听过的最好的比喻是这样的: 想象一下,您站在山顶上,并且刚刚堆了一个雪球。雪球一开始非常小…

    2023年6月29日
    12800
  • 比特币暴跌,以太币遭遇 2021 年以来最大跌幅,加密货币下跌

    周一,加密货币受到全球市场避险情绪的冲击,比特币一度下跌超过 16%,排名第二的以太币则遭遇了 2021 年以来最大跌幅。 截至纽约时间上午 7:08,顶级代币比特币交易价格下跌 14% 至 51,130 美元,上周下跌 13.1%,创下自 FTX 交易所崩溃以来的最大跌幅。以太币价值下跌逾五分之一,随后收复部分跌幅,以 2,246 美元的价格易手。大多数主…

    2024年8月13日
    8500
  • 非洲准备进行影响力投资的八个原因

    “如果不考虑新兴市场,你就不可能成为影响力投资者。投资非洲提供了金融和影响力机会。” — Jennifer Kenning, Align Impact首席执行官兼联合创始人 想要有所作为并赚取利润的投资者应该考虑技术采用、自然资源机会和人力资本增长最快的大陆:非洲。 非洲是土地和人口第二大大陆,拥有丰富的未开发自然资源、可持续农业的巨大潜力、变革性的自由贸易…

    2023年7月28日
    11300
  • 夫妻之间,如何做出明智的金钱选择?

    财务纠纷可能源于多种原因,包括对目标和优先事项的分歧,以及对谁赚得更多的愤怒和怨恨。有时,共同做出明智的资金选择可能是一个挑战。 好消息是:为金钱而争吵不一定是你们关系中的常态。通过采取行动成为一对对未来充满信心和兴奋的财务精明夫妇,您可以减少对家庭财务的焦虑、恐惧和其他负面情绪。 最重要的是,您可以感觉到与伴侣在经济上协调一致,这样您的家里就不会发生金钱斗…

    2023年7月1日
    16800

发表回复

登录后才能评论
客服
客服
关注订阅号
关注订阅号
分享本页
返回顶部