R语言—列表

列表

R语言的6种模式:向量、矩阵、数组、数据框、列表、因子

向量、矩阵、数组所包含的元素的类型都是相同的

列表和数据框是两种特殊的类型,即允许把不同类型的数据合并在单一对象中

定义

列表是由一些对象的有序结合所构建的对象,其中的每个对象称为列表的分量(component),它们的长度和类型可以不同。

  • 列表是R的数据类型中最为复杂的一种。
  • 列表是一些对象(或成分component)的有序集合。
  • 列表允许整合若干对象到单个对象名下
  • 列表中可能包含向量,矩阵,数据框,甚至其他列表
  • 列表类似于C语言的结构体类型,Python中的字典类型。从技术上讲,列表就是向量。之前我们接触的向量称为“原子型”向量,即向量的元素是最小的,不可再分的。而列表属于递归行向量。

创建列表(List)

语法:

mylist<-list(object1,object2…)
#或者
mylist<-list(name1=object1,name2=object2…)

以下是创建包含字符串,数字,向量的列表的示例:

> mylist<-list(name="Jack",wife="Rose",no.children=3,child.ages=c(4,7,9))
> mylist
$name
[1] "Jack"

$wife
[1] "Rose"

$no.children
[1] 3

$child.ages
[1] 4 7 9

  • 列表各组件的名称叫做标签(tags)

  • 列表的标签是可选的

  •   > mylist$child.ages
      [1] 4 7 9
      > mylist$chi
      [1] 4 7 9
    
  • 在引用标签时,标签的名字可以简写,只要不引起歧义。

列表(List)元素的引用

>mylist<-list(name="Jack",wife="Rose",no.children=3,child.ages=c(4,7,9))
> mylist[[4]][2]
[1] 7

> mylist[2]
$wife
[1] "Rose"
> mylist[[2]]
[1] "Rose“
> mylist$wife
[1] "Rose“
> mylist[["wife"]]
[1] "Rose"

> class(mylist[2])
[1] "list"
> class(mylist[[2]])
[1] "character“

说明:

  • 使用单中括号[]返回的是一个新的列表,是原列表的一个子列表
  • 使用双中括号[[]]提取列表的组件,返回值是组件本身的类型,而不是列表
  • 使用元素名称访问列表中的元素

创建如下形式的列表

image-20220904104913693
> mylist<-list(first=1,second=2,third=list(alpha=3.1,beta=3.2))
> mylist
$first
[1] 1

$second
[1] 2

$third
$third$alpha
[1] 3.1

$third$beta
[1] 3.2

生成如下子列表的索引操作

image-20220904105336988

方法1:mylist[1:2]
方法2:mylist[-3]
方法3:mylist[c(“first”,”second”)]
方法4:mylist[c(TRUE,TRUE,FALSE)]

列表(List)元素的修改

#创建列表
> mylist<-list(name="Jack",wife="Rose",no.children=3,child.ages=c(4,7,9))
> mylist
$name
[1] "Jack"

$wife
[1] "Rose"

$no.children
[1] 3

$child.ages
[1] 4 7 9

#修改列表
#修改"name"属性的值
> mylist$name <-"John"
#扩展列
> mylist$income <-c(1980,1600)
> mylist
$name
[1] "John"

$wife
[1] "Rose"

$no.children
[1] 3

$child.ages
[1] 4 7 9

$income
[1] 1980 1600

#修改"income"属性的值
> mylist$income =NULL
> mylist
$name
[1] "John"

$wife
[1] "Rose"

$no.children
[1] 3

$child.ages
[1] 4 7 9

  • 列表元素可以修改,只要把元素引用赋值即可
  • 列表中的元素可以增加
  • 可以删除列表中的某一项,将该项赋空值NULL
  • 可以用连接函数c()连接多个列表或者列表中的某一项组成新的列表

由于列表是向量,可以使用length()

> length(mylist)	#获得列表长度,即组件的个数
[1] 4

访问列表元素和值

使用names()获取列表各元素的标签

> names(mylist)
[1] "name"        "wife"        "no.children" "child.ages" 

使用unlist()获取列表中各元素的值

> unlist(mylist)	#返回一个字符向量
       name        wife no.children child.ages1 child.ages2 child.ages3 
     "John"      "Rose"         "3"         "4"         "7"         "9" 
> class(unlist(mylist))
[1] "character"
> z <-list(a=1,b=2,c=3)
> y <-unlist(z)
> y
a b c 
1 2 3 
> class(y)	#unlist()返回一个数值向量
[1] "numeric"

结论:在混合类型的情况下(既有字符型又有数值型),R选择字符串作为数据类型。

去列表化

> z<-list(a=1,b=2,c=3)
> y<-unlist(z)
> y
a b c 
1 2 3 

去掉元素名:

#方法1
names(y)<-NULL
> y
[1] 1 2 3

#方法2:
y<-unname(y)
> y
[1] 1 2 3

在列表上使用apply系列函数

lapply()函数 :即 list apply,对列表中的每个组件执行相同的函数,并返回另一个列表

> mylist<-list(1:3,25:29)
> mylist
[[1]]
[1] 1 2 3
[[2]]
[1] 25 26 27 28 29
#R对列表中的组件求中位数,并返回由2和27组成的列表
> lapply(mylist,median)
[[1]]
[1] 2
[[2]]
[1] 27

我们对列表求中位数,上面返回的是一个列表,实际上我们只是想知道具体数值。

使用 sapply()函数,即 simplified apply,可以返回的列表可以转化成矩阵或者向量的形式

> sapply(mylist,median)
[1]  2 27

递归型列表

列表可以是递归的(recursive),即列表的组件也可以是列表

> b<-list(u=5,v=12)
> c<-list(w=13)
> a<-list(b,c)
> a
[[1]]
[[1]]$u
[1] 5

[[1]]$v
[1] 12


[[2]]
[[2]]$w
[1] 13

学生信息表,如果每个学生的数据存储为一个列表,则整个数据库就是由所有学生的列表组成的列表,就构成了递归型列表。

image-20220904114828830

  • 1
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

W_chuanqi

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值