R(07):第二章:2.6列表与数据框

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/genome_denovo/article/details/82194357

《统计建模与R软件》薛毅

第2章 R软件的使用

2.6 列表与数据框

总结:列表函数为list(),各元素存在变量名称与变量或向量的对应关系,列表取值用“[[]]”双中括号或用“列表名$变量名称”,列表变量的修改“列表名$变量名称 <- '新变量'”;数据框生成用data.frame()函数,每个变量名对应一个向量;as.data.frame(Lst)函数可讲列表转换成数据框;数据框的取值范围和矩阵相同:df[1:2];数据框按照列引用:数据框名$列名;改变数据框名names(df),改变数据框行名rownames(df),改变数据框列名colnames(df);attach()函数将数据框放入内存,直接输入列名可数据该列的向量内容。

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] #[2]表示取Lst列表的第二个元素,即wife=”Mary”
$wife
[1] "Mary"
> Lst[[2]] #[[2]]表示取Lst列表的第二个元素的元素内容
[1] "Mary"
> Lst[[4]]
[1] 4 7 9
> Lst[[4]][2]
[1] 7
但,列表不同于向量,每次只能取一个元素,如Lst[[1:2]]但用法是不允许的。
两重括号取出列表的一个元素,结果与该元素类型相同,如果使用一重括号,则结果是列表的一个子列表(结果类型仍为列表)。 所以一重括号可以取范围,而两重括号则不允许。
在定义列表时如果指定了元素的名字,则引用元素还可以用它的名字作为下标,格式为“列表名[[“元素名”]]”,例如:
> Lst[['name']]
[1] "Fred"
> Lst[['child.ages']]
[1] 4 7 9
另一种格式是“列表名$元素名”,例如:
> Lst$wife
[1] "Mary"
> Lst$child.ages
[1] 4 7 9
构造列表的一般格式为:
Lst <- list(name_1=object_1, …, name_m=object_m)
其中name是列表元素名称,object是列表元素的对象。

2. 列表的修改

列表元素的修改,只要把元素引用赋值即可,例如将Fred改成John:
> Lst$name <- 'Join'
> Lst$name
[1] "Join"
如果需要增加一项家庭收入,分别是1980和1600,则输入:
> Lst$income <- c(1980,1600)
> Lst$income
[1] 1980 1600
> Lst$income <- NULL #删除列表中的某一项
几个列表可以用连接函数c()连接起来,结果仍然为一个列表,其元素为各自变量的列表元素,例如:
list.ABC <- c(list.A, list.B, list.C)

3. 返回值为列表的函数

在R语言中,有许多函数的返回值是列表,如求特征向量的函数eigen(),奇异值分解函数svd()和最小二乘函数lsfit()等

2.6.2 数据框

数据框是矩阵形式的数据,但矩阵各个列可以是不同类型的数据,数据框每列是一个变量,每行是一个观测。
但是,数据框有更一般的定义,它是一种特殊的列表对象,有一个值为“data.frame”的class属性,各列表成员必须是向量(数值型、字符型、逻辑型)、因子、数值型矩阵、列表或其他数据框。

1. 数据框的生成

数据框可以用data.frame()函数生成,其用法与list()函数相同,各自变量变成数据框的成分,自变量可以命名,成为变量名,例如:
> df <- data.frame(Name=c('Alice','James','Becka','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 James F 13 65.3 98.0
3 Becka 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','James','Becka','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))
> as.data.frame(Lst)
最后as.data.frame(Lst)是与df相同的数据框
一个矩阵可以用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]
Name sex
1 Alice F
2 James F
3 Becka M
4 Jeffrey M
5 John M
> df[1:2, 3:5]
Age Height Weight
1 13 56.5 84
2 13 65.3 98
数据框的各个变量也可以按列表引用(即用双引号[[]]或$符号引用),例如:
> df$Weight
[1] 84.0 98.0 83.0 84.0 99.5
> df[['Weight']]
[1] 84.0 98.0 83.0 84.0 99.5
数据框的变量名由属性names定义,此属性一定是非空的,数据框的各行也可以定义名字,可以用rownames属性定义,数据框的各列也可以定义名字,可以用colnames属性定义,例如:
> names(df)
[1] "Name" "sex" "Age" "Height" "Weight"
> rownames(df) <- c('one','two','three','four','five')
> df
··· Name sex Age Height Weight
one Alice F 13 56.5 84.0
two James F 13 65.3 98.0
three Becka M 12 57.3 83.0
four Jeffrey M 13 62.5 84.0
five John M 12 59.0 99.5
> colnames(df) <- c('1','2','3','4','5')
> df
···· 1 2 3 4 5
one Alice F 13 56.5 84.0
two James F 13 65.3 98.0
three Becka M 12 57.3 83.0
four Jeffrey M 13 62.5 84.0
five John M 12 59.0 99.5

3. attach()函数

attach()函数可以把数据框中的变量“链接”到内存中,这样便于数据框数据的调用,例如:
> attach(df)
> Height #链接到内存后可以直接调用df数据框当中的列名内的数据了
[1] 56.5 65.3 57.3 62.5 59.0
> r <- Height/Weight; r
[1] 0.6726190 0.6663265 0.6903614 0.7440476 0.5929648
> df$r <- Height/Weight #将df数据框中的Height列除以Weight列的结果存入df数据框当中的r列
> df
Name sex Age Height Weight r
1 Alice F 13 56.5 84.0 0.6726190
2 James F 13 65.3 98.0 0.6663265
3 Becka M 12 57.3 83.0 0.6903614
4 Jeffrey M 13 62.5 84.0 0.7440476
5 John M 12 59.0 99.5 0.5929648
> detach() #释放内存

2.6.3 列表与数据框的编辑

如果需要对列表或数据框中的数据进行编辑,也可以调用函数edit()进行编辑、修改,命令格式为:
> xnew <- edit(xold)
其中xold是原列表或数据框,xnew是修改后的列表或数据框,注意:愿数据xold并没有改动,改动的数据存放在xnew中。
函数edit()也可以对向量、数组或矩阵类型的数据进行修改或编辑。

猜你喜欢

转载自blog.csdn.net/genome_denovo/article/details/82194357
今日推荐