1 list 本质上也是一种向量
1.1普通的向量是原子型(atomic)向量,就是说,向量的元素已经是最小的不可再分的了。
而list属于“递归型”(recursive)向量。
1.2 list可以包含不同的数据类型。(显然普通的向量是不行的)
2 创建list
2.1
#method 1
> j<-list(name="Joe",salary=10000,union=T)
> j
$name
[1] "Joe"
$salary
[1] 10000
$union
[1] TRUE
#method 2: without column name
> j<-list("Joe",10000,T)
> j
[[1]]
[1] "Joe"
[[2]]
[1] 10000
[[3]]
[1] TRUE
# method 3: create it like a special vector
> z<-vector(mode="list")
> z[['v1']]<-3
> z
$v1
[1] 3
2.2 在引用的时候,标签的名字可以简写,只要写出前几个字母,且不引起歧义,R都能够识别。
2.3 在创建时,建议为每列命名,这样能使程序更加清楚明了,不易出错。
3 列表索引与增删改查
列表索引虽然和向量相似,但是还是有很大的不同,因此要非常注意。
3.1 索引方法
#method 1
> j$salary
[1] 1e+04 1e+06
> j$salary[1]
[1] 10000
#method 2
> j[[2]]
[1] 1e+04 1e+06
> j[[2]][1]
[1] 10000
#method 3
> j[["salary"]]
[1] 1e+04 1e+06
> j[["salary"]][1]
[1] 10000
#method 4
> j[1]
$name
[1] "Joe" "fan"
> class(j[1])
[1] "list"
> j[1][1]
$name
[1] "Joe" "fan"
3.3.1 注意:前三种方法,取得的值都是各自数据类型的向量,我们取出了salary这一列,如果我们用class查看,其结果是numeric;而最后一种方法,取得的是list!
3.3.2 一定要区分[[ ]]和[ ] 这两种操作符。前者(即[[ ]]),取出的是一个普通的向量,其数据类型是向量中元素的数据类型;而后者(即[]),取出的依然是list,千万不要搞混
3.3.3 总结一下,在R中,对提取list中的指有共有两大类方法,其区别就在于取出的值是list还是其本身的类型
大类一:取出的值是其数据类型本身
>j$salary
>j[["salary"]]
>j[[1]]
大类二:取出的是列表
>j["salary"]
>j[1]
3.2 增加
列表和向量不同,我们可以向列表中添加一个值。
#method 1
> z<-list(a="abc",b=12)
> z
$a
[1] "abc"
$b
[1] 12
> z$c<-c("sailing","car") #添加
> z
$a
[1] "abc"
$b
[1] 12
$c
[1] "sailing" "car"
#method 2
> z[[4]]<-c(29,28) #注意,要用双中括号
> z
$a
[1] "abc"
$b
[1] 12
$c
[1] "sailing" "car"
[[4]]
[1] 29 28
> z
$a
[1] "abc"
$b
[1] 12
$c
[1] "sailing" "car"
[[4]]
[1] 29 28
#method 1
> z[4]<-NULL #删除,单中括号和双中括号都可以。
> z
$a
[1] "abc"
$b
[1] 12
$c
[1] "sailing" "car"
> z
$a
[1] "abc"
$b
[1] 12
$c
[1] "sailing" "car"
<pre name="code" class="plain">#method 2
> z$a<-NULL #删除> z$b[1] 12$c[1] "sailing" "car"
3.3.2 当为一个列设定了NULL之后,R会自动的索引序号,被删除列后面的索引均会自动减去1。
3.4 将两个list拼接起来
> z<-c(list('abc',2,T),list(4))
> z
[[1]]
[1] "abc"
[[2]]
[1] 2
[[3]]
[1] TRUE
[[4]]
[1] 4
4 常用操作
4.1 length() 查看list的列数
4.2 unlist() 将list转化为向量。如果list中存在着不同的存储模式,R将会自动的将不同的存储模式转化为一种,R会选择能够最大的保持他们共同特征的类型。
4.3 unname(j) 或者是 names(j)<-NULL 都可以将list j的列名去除
4.4 names(j) 查看list j的列名
4.5 lapply(list,function) (list apply) 同矩阵的apply类似,对list中的每个组建应用function函数。
5 递归性列表
列表的递归性是指:列表中的组建依旧可以是列表。
> a<-list("a","afd","dfa")
> b<-list(1,2,3,4,5)
> c<-list(a,b)
> c
[[1]]
[[1]][[1]]
[1] "a"
[[1]][[2]]
[1] "afd"
[[1]][[3]]
[1] "dfa"
[[2]]
[[2]][[1]]
[1] 1
[[2]][[2]]
[1] 2
[[2]][[3]]
[1] 3
[[2]][[4]]
[1] 4
[[2]][[5]]
[1] 5