R导论学习笔记(六):列表和数据框

1
2
3
下面的例子演示怎么创建一个列表:

> Lst <- list(name="Fred", wife="Mary", no.children=3,child.ages=c(4,7,9))
1
`分量常常会被编号的(numbered),并且可以利用这种编号来访问分量。如果列表 Lst 有四个分量,这些分量则可以用Lst[[1]], Lst[[2]], Lst[[3]] 和Lst[[4]]独立访问。如果Lst[[4]] 是一个有下标的数组,那么Lst[[4]][1] 就是该数组的第一个元素。`
1
2
3
4
5
6
7
8
9
10
11
12
13
14
列表的分量可以被命名,这种情况下可以通过名字访问。此时,可以把字符串形式的分量名字放在列表名后面的双中括号中,或者干脆采用下面的形式

> name$component name
此在上面给定的例子中,
Lst$name 和Lst[[1]] 返回结果都是"Fred",
Lst$wife 和Lst[[2]] 返回的则是"Mary",
而Lst$child.ages[1] 和Lst[[4]][1] 返回一样的数字4。
另外你同样可以在双中括号中使用列表分量的名字,即和Lst$name 等价的Lst[["name"]]

这里特别要注意一下Lst[[1]] 和Lst[1] 的差别。[[. . . ]] 是用来选择单个元素的操作符,而[. . . ] 是一个更为一般的下标操作符。因此前者得到的是列表Lst 中的
第一个对象, 并且含有分量名字的命名列表(named list)中的分量名字会被排除在外的。后者得到的则是列表Lst 中仅仅由第一个元素构成的子列表。如果是命名列表,分量名字会传给子列表的。即
Lst[[1]] 得到 Fred
Lst[1] 得到name="Fred"

1
2
3
4
5
可以通过函数list() 将已有的对象构建成列表。下面的命令

> Lst <- list(name 1 =object 1 , . . . , name m=object m)将创建一个含有m 个分量的列表Lst。它的分量分别是object 1, . . . , object m,分量名则是由参数得到(命名没有特定要求)。如果这些名字被忽略了,那么分量只有被编号了。当连接函数c() 的参数中有列表对象时,结果就是一个列表模式的对象

> list.ABC <- c(list.A, list.B, list.C)
1
`数据框常常会被看作是一个由不同模式和属性的列构成的矩阵。它能以矩阵形式出现,行列可以通过矩阵的索引习惯访问。可以通过函数data.frame 创建符合上面对列(分量)限制的数据框对象:> accountants <- data.frame(home=statef, loot=incomes, shot=incomef)`
1
`从外部文件读取一个数据框最简单的方法是使用函数read.table()`
1
2
3
4
5
6
7
8
9
用$ 符号访问对象不是非常的方便,如accountants$statef。一个非常有用的工具将会使列表或者数据框的分量可以通过它们的名字直接调用。而且这种调用是暂时性的,没有必要每次都显式的引用列表名字。函数attach() 除了可以用目录路径作为参数,也可以使用数据框。假定数据框lentils 有三个变量lentils$u, lentils$v, lentils$w,那么

> attach(lentils)将把数据框绑定在搜索路径的位置2(position 2)上(注释:R 的搜索路径是一种层状结构,当前搜索位置是1,可以通过函数attach()设置搜索路径的位置2。)。如果位置1没有变量u, v 或w,那么u, v 和w 直接在数据框中访问。因此,下面的命令

> u <- v+w际上没有替换数据框中的变量u,而是被处于搜索路径位置1工作空间中的变量u 所屏蔽。为了真正改变数据框中的数据,最简单的办法还是使用$ 符号:

> lentils$u <- v+w去除一个数据框的绑定,可以使用

> detach()
1
`如何使用数据框• 处理问题时,将相应的数据框绑定在位置2上,在第1 层的工作目录中存放操作值和临时变量;• 问题结束时,用$ 形式的赋值命令把任何你想保留的变量加入数据框中,然后利用函数detach() 将绑定去除;• 最后去掉工作目录中所有你不想要的变量,尽可能清空临时变量。`
-------------Thanks for Reading!-------------