6.1 列表
列表是由称作组件的有序对象集合构成的对象。组件的模式或类型不一定相同。
形如Lst <- list(name_1=object_1, . . ., name_m=object_m)的赋值将创建一个包含m个组件的列表,并根据参数中指定的名称为其命名。(其名称可以自由选取)。如果它们的名称被省略,组件将只是被编号。例如:
> Lst <- list(name="Fred", wife="Mary", no.children=3,child.ages=c(4,7,9))
所使用的组件是被复制到新的列表中的,对原始对象没有影响。
组件总是被编号的,并且可以通过编号指定。
Lst[[1]] 即为"Fred",也可以用 Lst$name,Lst[["name"]]指定。如果Lst[[4]]是一个有下标的数组,Lst[[4]][1]就是它的第一项。
区分Lst[[1]]和Lst[1],'[[...]]'是选择单个元素时使用的操作符,而'[...]'是一个一般的下标操作符。因此,前者代表列表Lst中的第一个对象;后者是列表Lst的子列表,仅包含列表的第一项。
组件的名称可以缩写,可缩写的程度是只要能令组件被唯一的识别就可以了。如:Lst$na等价于Lst$name, Lst$w等价于Lst$wife。
扩展列表
可以通过指定额外组件的方式。例如
> Lst[5] <- list(matrix=Mat)
连接列表
当连接函数c()的参数为列表时,其结果也是一个模式为列表的对象。由参数中的列表作为组件依次连接而成。
> list.ABC <- c(list.A, list.B, list.C)
6.2 数据帧
数据帧是类别为"data.frame"的列表;
数据帧会被当作各列具有不同模式和属性的矩阵。
数据帧按照矩阵的方式显示,选取的行或列也按照矩阵的方式来索引。
创建数据帧
直接创建:那些满足对数据帧的列(组件)限制的对象可以通过函数data.frame来构建成为一个数据帧
> t <- data.frame(home=statef, loot=income, shot=incomef)
强制转换:如果一个列表的组件与数据帧的限制一致,这个列表就可以通过函数as.data.frame()强制转化为一个数据帧。
外部文件:创建数据帧最简单的方法应当是使用read.table()函数从外部文件中读取整个数据帧。
数据帧和列表的限制
1 组件必须是向量(数值型,字符形,逻辑型),因子,数值矩阵,列表,或其他数据帧;
2 矩阵,列表,数据帧向新数据帧提供的变量数分别等于它们的列数,元素数和变量数;
3 数值向量,逻辑值和因子在数据帧中保持不变,字符向量将被强制转化为因子,其水平是字符向量中所出现的值;
4 数据帧中作为变量的向量结构必须具有相同的长度,而矩阵结构应当具有相同的行大小。
挂接和卸载数据帧
当觉得使用'$'引用数据帧元素(如't$home')麻烦时,可以进行数据帧挂接
> attach(t) 这样可以直接引用数据帧内的元素,而无需'$',前提是数据帧外没有同名的变量(如name)。
挂接后若要对数据帧元素进行赋值操作,仍需用'$',否则视为赋值给数据帧外的元素。
赋值后必须要先卸载(detach)再重新挂接后,新值才可见。
> detach(t)
attach()是具有一般性的函数,即它不仅能够将目录和数据帧挂接在搜索路径上,还能挂接其他类别的对象。特别是模式为"list"的对象可以通过相同的方式挂接:
> attach(any.old.list)
任何被挂接的对象都可以用detach来卸载,通过指定位置编号或者指定名称这样的方式.
搜索路径
函数search()将显示目前的搜索路径,可以用来查看数据帧/列表的挂接状态。
ls()(或objects())命令可以用来检查搜索路径任意位置上的内容。如:ls(), ls(2), ls(t)
R可以在搜索路径中包含至多20个项目,列表和数据帧只能在位置2或更靠后的位置上挂接。
数据帧使用惯例
1 将每个独立的,适当定义的问题所包含的所有变量收入同一个数据帧中,并赋予合适的、易理解、易辨识的名称;
2 处理问题时,当相应的数据帧挂接于位置2,同时在第1层工作目录下存放操作的数值和临时变量;
3 在结束一次工作之前,将你认为对将来有参考价值的变量通过$标记的形式添加到数据帧里面,然后detach();
4 最后,将工作目录下所有不需要的变量剔除,并且尽量将剩下多余的临时变量都清除干净。
这样我们可以很简单的在同一个目录下处理多个问题,而且对每个问题都可以使用x,y,z这样的变量名。