2.6 列表与数据框
2.6.1 列表
1.列表的构造
列表是一种特别的对象集合,它的元素也由序号(下标)区分,但是各元素的类型可以是任意对象,不同元素不必是同一类型,元素本身允许是其他复杂数据类型,比如,列表的一个元素也允许是列表
> Lst<-list(name="Fred",wife="Mary",no.children=3,child.ages=c(4,7,9));Lst
$name
[1] "Fred"
$wife
[1] "Mary"
$no.children
[1] 3
$child.ages
[1] 4 7 9
> Lst[2]
$wife
[1] "Mary"
> Lst[[2]]
[1] "Mary"
> Lst[4][2]
$<NA>
NULL
> Lst[[4]][2]
[1] 7
> Lst[[1:2]]
Error in Lst[[1:2]] : 下标出界
注意,“列表名[下标]"或"列表名[下标范围]"的用法是合法的,但其意义与用两重括号的记法完全不同,两重记号取出列表的一个元素,结果与该元素类型相同,如果使用一重括号,则结果是列表的一个子列表,结果类型仍为列表
> Lst[["name"]]
[1] "Fred"
> Lst[["child.ages"]]
[1] 4 7 9
> Lst$name
[1] "Fred"
> Lst$wife
[1] "Mary"
> Lst$child.ages
[1] 4 7 9
构造列表的一般格式为
Lst<-list(name_1=object_1,...,name_m=object_m)
其中name是列表元素的名称,object是列表元素的对象
2.列表的修改
> Lst$name<-"John"
> Lst$income<-c(1980,1600)
> Lst
$name
[1] "John"
$wife
[1] "Mary"
$no.children
[1] 3
$child.ages
[1] 4 7 9
$income
[1] 1980 1600
2.6.2 数据框
数据框是R的一种数据结构,它通常是矩阵形式的数据,但矩阵各列可以是不同类型的,数据框每列是一个变量,每行是一个观测
数据框有更一般的定义,他是一种特殊的列表对象,有一个值为“data.frame”的class属性,各列表成员必须是向量(数值型、字符型、逻辑型)、因子、数值型矩、列表,或其它数据框。向量、因子成员为数据框提供一个变量,如果向量非数值型会被强制转换为因子,而矩阵、列表、数据框这样的成员为新数据框提供了和其列数、成员数、变量数相同个数的变量。作为数据框变量的向量、因子或矩阵必须具有相同的长度
1.数据框的生成
> df<-data.frame(Name=c("Alice","Becka","James","Jeffrey","John"),
+ Sex=c("F","F","M","M","M"),
+ Age=c(13,13,12,13,12),
+ Height=c(56.5,65.3,57.3,62.5,59.0),
+ Weight=c(84.0,98.0,83.0,84.0,99.5));df
Name Sex Age Height Weight
1 Alice F 13 56.5 84.0
2 Becka F 13 65.3 98.0
3 James M 12 57.3 83.0
4 Jeffrey M 13 62.5 84.0
5 John M 12 59.0 99.5
如果一个列表的各个成分满足数据框成分的要求,它可以用as.data.frame()函数强制转换为数据框
> Lst<-list(Name=c("Alice","Becka","James","Jeffrey","John"),
+ Sex=c("F","F","M","M","M"),
+ Age=c(13,13,12,13,12),
+ Height=c(56.5,65.3,57.3,62.5,59.0),
+ Weight=c(84.0,98.0,83.0,84.0,99.5));Lst
$Name
[1] "Alice" "Becka" "James" "Jeffrey" "John"
$Sex
[1] "F" "F" "M" "M" "M"
$Age
[1] 13 13 12 13 12
$Height
[1] 56.5 65.3 57.3 62.5 59.0
$Weight
[1] 84.0 98.0 83.0 84.0 99.5
> as.data.frame(Lst)
Name Sex Age Height Weight
1 Alice F 13 56.5 84.0
2 Becka F 13 65.3 98.0
3 James M 12 57.3 83.0
4 Jeffrey M 13 62.5 84.0
5 John M 12 59.0 99.5
一个矩阵可以用data.frame()转化为一个数据框,如果它原来有列名则其列名被作为数据框的变量名;否则系统自动为各矩阵的各列起一个变量名
> X<-array(1:6,c(2,3))
> data.frame(X)
X1 X2 X3
1 1 3 5
2 2 4 6
2.数据框的引用
> df[1:2,3:5]
Age Height Weight
1 13 56.5 84
2 13 65.3 98
> df[["Height"]]
[1] 56.5 65.3 57.3 62.5 59.0
> df$Weight
[1] 84.0 98.0 83.0 84.0 99.5
> names(df)
[1] "Name" "Sex" "Age" "Height" "Weight"
> rownames(df)
[1] "1" "2" "3" "4" "5"
> rownames(df)<-c("one","two","three","four","five");df
Name Sex Age Height Weight
one Alice F 13 56.5 84.0
two Becka F 13 65.3 98.0
three James M 12 57.3 83.0
four Jeffrey M 13 62.5 84.0
five John M 12 59.0 99.5
3.attach()函数
数据框的主要用途是保存统计建模的数据,R的统计建模功能都需要以数据框为输入数据。我们可以把数据框当成一种矩阵来处理。在使用数据框的变量 时可以用“数据框名$变量名”的记法。但是,这样使用较麻烦,R提供了attach()函数可以把数据框众的变量链接到内存中,这样便于数据框数据的调用
> r<-Height/Weight
错误: 找不到对象'Height'
> attach(df)
> r<-Height/Weight;r
[1] 0.6726190 0.6663265 0.6903614 0.7440476 0.5929648
后一语句将在当前工作空间建立一个新的变量r,它不会自动进入数据框df中,要把新变量赋值到数据框中,可以用
> df$r<-Height/Weight;df
Name Sex Age Height Weight r
one Alice F 13 56.5 84.0 0.6726190
two Becka F 13 65.3 98.0 0.6663265
three James M 12 57.3 83.0 0.6903614
four Jeffrey M 13 62.5 84.0 0.7440476
five John M 12 59.0 99.5 0.5929648
为了取消连接,只要调用detach()
注:R中名字空间的管理是比较独特的,它在运行时保持一个变量搜索路径表,在读取某个变量时到这个变量搜索路径表中由前向后查找,找到最前的一个;在赋值时总是在位置1赋值(除非特别指定在其它位置赋值)。attach()的缺省位置是在变量搜索路径表的位置2,detach()缺省也是去掉位置2,所以,R编程的一个常见问题是当你误用了一个自己并没有赋值的变量时有可能不出错,因为这个变量已在搜索路径中某个位置有定义,这样不利用程序的调试
2.6.3 列表与数据框的编辑
如果需要对列表或数据框中的数据进行编辑,也可以调用函数edit()进行编辑、修改,其命令格式为
xnew<-edit(xold)
其中xold是原列表或数据框,xnew是修改后的列表或数据框,注意:原数据xold并没有改动,改动的数据存放在xnew中