列表--R语言

1.列表

列表(list)是R语言的数据类型中最为复杂的一种。一般来说,列表就是一些对象的有序集合。列表允许整合若干对象到单个对象名下。例如,某个列表可能是若干向量、矩阵、数据框,甚至其他列表的组合。

1.1 创建列表

list函数用于创建列表,格式如下:
List(object1,object2,…)
其中的对象可以是目前为止介绍过的任何类型。创建列表时,列表中对象命名的格式如下:
List(name1=object1,name2=object2,…)

data <- list(a='python',               
             b=c(11,22,33,44),
             c=matrix(seq(1,12),nrow=4,
                      dimnames=list(c('r1','r2','r3','r4'),c('c1','c2','c3'))),
             d=array(seq(1,12),dim=c(2,3,2),
                     dimnames=list(c('r1','r2'),c('c1','c2','c3'),c('s1','s2'))),
             e=data.frame(name = c('zhangsan','wangwu','liuer'),
                        age = c(23,45,56),
                        birth_place = c('tianjin','wuhan','hefei')))
data

在这里插入图片描述
在这里插入图片描述

没有命名分量名称时

data2 <- list('python',               
             c(11,22,33,44),
             matrix(seq(1,12),nrow=4,
                      dimnames=list(c('r1','r2','r3','r4'),c('c1','c2','c3'))),
             array(seq(1,12),dim=c(2,3,2),
                     dimnames=list(c('r1','r2'),c('c1','c2','c3'),c('s1','s2'))),
             data.frame(name = c('zhangsan','wangwu','liuer'),
                          age = c(23,45,56),
                          birth_place = c('tianjin','wuhan','hefei')))
data2

在这里插入图片描述
在这里插入图片描述

1.2 列表的索引

1.2.1 直接索引

单个分量的索引

一个中括号[]与两个中括号[[]]返回的数据类型不同,一个中括号[]返回的依然是列表,两个中括号[[]]返回的是向量。

> aa <- data[2]
> aa
$b
[1] 11 22 33 44

> class(aa)
[1] "list"
> bb <- data[[2]]
> bb
[1] 11 22 33 44
> class(bb)
[1] "numeric"
> is.vector(bb)
[1] TRUE
多个分量的索引
> dd <- data[c(1,3)]
> dd
$a
[1] "python"

$c
   c1 c2 c3
r1  1  5  9
r2  2  6 10
r3  3  7 11
r4  4  8 12

1.2.2 名称索引

> # 方式一:  <列表名>$<分量名称>
> ww <- data$d
> ww
, , s1

   c1 c2 c3
r1  1  3  5
r2  2  4  6

, , s2

   c1 c2 c3
r1  7  9 11
r2  8 10 12

> class(ww)
[1] "array"
> 
> # 方式二:[]
> ss <- data['d']
> ss
$d
, , s1

   c1 c2 c3
r1  1  3  5
r2  2  4  6

, , s2

   c1 c2 c3
r1  7  9 11
r2  8 10 12


> class(ss)
[1] "list"
> 
> #方式三: [[]]
> qq <- data[['d']]
> qq
, , s1

   c1 c2 c3
r1  1  3  5
r2  2  4  6

, , s2

   c1 c2 c3
r1  7  9 11
r2  8 10 12

> class(qq)
[1] "array"

1.2.3 二级索引

> # 情况1
> data[1][1]  # 返回列表data[1]中的第一个列表
$a
[1] "python"

> data[1][2]  # 会报错,因为返回列表中只有一个列表,没有下标2
$<NA>
NULL

> 
> # 情况2
> data[[2]][2]  #返回向量b中的第二个元素
[1] 22
> data$b[2]
[1] 22
> data[['b']][2] 
[1] 22

1.3 列表编辑

1.3.1 单个元素修改

# <列表名>[[成分序号]]
# <列表名>[[成分名称]]
# <列表名>$成分名称
# 上述三种形式返回的均值组成列表的成分原本的数据结构
# 列表相应成分的修改在此基础上进行
# 列表data第一个成分:单个字符串修改
data[[1]] <- 'R语言'
data
# 列表data第二个成分:向量修改
data[['b']][3] <- 3333
data

# 列表data第三个成分:矩阵修改
data[[3]][2,2] <- 666
data
data[['c']][c(3,4),c(2,3)] <- c(77,88,111,1212)
data

# 列表data第四个成分:数据框修改
data$e[,2][3] <- 11
data
data$e$birth_place[2] <- 'hefei'
data

在这里插入图片描述

1.3.2 修改某一成分的所有值

> # 1.3.1 修改向量(三种方式)
> data[[2]] <- c(66,77)
> data[2]
$b
[1] 66 77

> data[['b']] <- c(77,88)
> data[2]
$b
[1] 77 88

> data$b <- c(88,99)
> data[2]
$b
[1] 88 99

> #1.3.2 修改矩阵
> data[[3]] <- matrix(seq(2,by=2,length.out=6),nrow=3)
> data[3]
$c
     [,1] [,2]
[1,]    2    8
[2,]    4   10
[3,]    6   12

> # 既可以将整个成分修改为原来的数据结构,也可改变数据结构
> data[[3]] <- list('a','b','c')   #改为列表
> data[3]
$c
$c[[1]]
[1] "a"

$c[[2]]
[1] "b"

$c[[3]]
[1] "c"


> data$c <- c('R','python')   #改为向量
> data[3]
$c
[1] "R"      "python"

# 修改多个成分
data[c(2,3)] <- list(rep(1,3),matrix(1:4,nrow=2))
data[c(2,3)]

1.3.3 列表成分的新增

方法一:

> data$f <- c('郑州','合肥','武汉')
> data[[7]] <- c(1,2,3)
> data[8] <- list(c('ss','ww'))
> data[c(6,7,8)]
$f
[1] "郑州" "合肥" "武汉"

[[2]]
[1] 1 2 3

[[3]]
[1] "ss" "ww"

方法二:

> data1 <- c(data,list(c('R','python')))  # 与一个包含一个成分的列表合并
> data1[c(5,6)]
$e
      name age birth_place
1 zhangsan  23     tianjin
2   wangwu  45       wuhan
3    liuer  56       hefei

[[2]]
[1] "R"      "python"

1.3.4 删除成分

> # 1.3.5 删除成分
> data[2] <- NULL
> data[[2]] <- NULL
> data['a'] <- NULL
> data[['d']] <- NULL
> data$e <- NULL
> data
named list()
  • 3
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值