R-4因子、列表、数据框及输入输出.ppt

上传人:本田雅阁 文档编号:2090407 上传时间:2019-02-12 格式:PPT 页数:39 大小:1.88MB
返回 下载 相关 举报
R-4因子、列表、数据框及输入输出.ppt_第1页
第1页 / 共39页
R-4因子、列表、数据框及输入输出.ppt_第2页
第2页 / 共39页
R-4因子、列表、数据框及输入输出.ppt_第3页
第3页 / 共39页
亲,该文档总共39页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述

《R-4因子、列表、数据框及输入输出.ppt》由会员分享,可在线阅读,更多相关《R-4因子、列表、数据框及输入输出.ppt(39页珍藏版)》请在三一文库上搜索。

1、第四讲 R的数据结构(二) 因子、列表、数据框,目的:,学习R中离散变量、混合数据的表示方法,内容:,数据表示方法 实例 作业,因子(factor)和有序因子,统计中的变量重要类别 连续: 区间变量 离散: 名义变量、有序变量 区间变量取连续的数值,可以求和、算平均等。 名义变量和有序变量取离散值,既可用数值表示也可取字符型值,其具体数值没有数量意义,不能用于加减乘除计算而只能用来分类或者计数。名义变量比如性别、省份、职业,有序变量比如班级名次、质量等级等。 因为离散变量有各种不同表示方法,在R中为统一起见使用因子(factor)来表示这种分类变量。还提供了有序因子(ordered facto

2、r)来表示有序变量。,因子是一种特殊的字符型向量,其中每一个元素取一组离散值中的一个,而因子对象有一个特殊属性levels表示这组离散值(用字符串表示)。例如: x y y 1 男 女 男 男 女 Levels: 男 女,函数factor()用来把一个向量编码成为一个因子。一般形式为: factor(x, levels = sort(unique(x), na.last = TRUE), labels, exclude = NA, ordered = FALSE),可以自行指定各离散取值水平(levels),不指定时由x的不同值来求得。 labels可以用来指定各水平的标签,不指定时用各离散取

3、值的对应字符串。 exclude参数用来指定要转换为缺失值(NA)的元素值集合。如果指定了levels,则因子的第i个元素当它等于水平中第j个时元素值取“j”,如果它的值没有出现在levels中则对应因子元素值取NA。 ordered取真值时表示因子水平是有次序的(按编码次序)。 可以用is.factor()检验对象是否因子,用as.factor()把一个向量转换成一个因子。, x y y 1 男 女 男 男 女 Levels: 男 女, x y y 1 男 女 男 男 女 Levels: 男 女,因子的基本统计是频数统计,用函数table()来计数。 例如, sex res.tab res.

4、tab 男 女 3 2 表示男性3人,女性2人。table()的结果是一个带元素名的向 量,元素名为因子水平,元素值为该水平出现的频数。 R的结果除了可以显示外,本身都是R对象(如这里的向量结果),可以很方便地进一步处理。 可以用两个或多个因子进行交叉分类。比如,性别(sex)和职业(job)交叉分组可以用table(sex, job)来统计每一交叉类的频数,结果为一个矩阵,矩阵带有行名和列名,分别为两个因子的各水平名。,因子可以用来作为另外的同长度变量的分类变量。比如,假设上面的sex是5个学生的性别,而 h table(h, sex) sex h 男 女 159 0 1 165 1 0 1

5、68 1 0 170 0 1 172 1 0 tapply(h, sex, mean) #可以求按性别分类的身高平均值。 男 女 168.3333 164.5000,列表(list)定义,列表是一种特别的对象集合,它的元素也由序号(下标)区分,但是各元素的类型可以是任意对象,不同元素不必是同一类型。元素本身允许是其它复杂数据类型,比如,列表的一个元素也允许是列表。 列表元素用“列表名下标”的格式引用。 但是,列表不同于向量,我们每次只能引用一个元素,如rec1:2的用法是不允许的。 注意:“列表名下标”或“列表名下标范围”的用法也是合法的,但其意义与用两重括号的记法完全不同,两重记号取出列表的

6、一个元素,结果与该元素类型相同,如果使用一重括号,则结果是列表的一个子列表(结果类型仍为列表)。, rec = list(name=“李明“, age=30, scores=c(85, 76, 90) rec $name 1 “李明“ $age 1 30 $scores 1 85 76 90, rec1 $name 1 “李明“ rec1 1 “李明“ rec2 $age 1 30 rec2 1 30, rec3 $scores 1 85 76 90 rec3 1 85 76 90 rec31:2 1 85 76 mode(rec1) 1 “list“ mode(rec1) 1 “charac

7、ter“,在定义列表时如果指定了元素的名字(如rec中的name,age,scores),则引用列表元素还可以用它的名字作为下标,格式为“列表名“元素名“”,如: rec“age“ 1 30 另一种格式是“列表名$元素名”,如: rec$age 1 30 其中“元素名”可以简写到与其它元素名能够区分的最短程度,比如“rec$s”可以代表 “rec$score”。 这种写法方便了交互运行,编写程序时一般不用简写,以免降低了程序的可读性。,使用元素名的引用方法可以让我们不必记住某一个下标代表那一个元素,而直接用易记的元素名来引用元素。事实上,已知向量和矩阵都可以指定元素名、行名、列名。 定义列表使

8、用list()函数,每一个自变量变成列表的一个元素,自变量可以用“名字值”的方式给出,即给出列表元素名。 自变量的值被复制到列表元素中,自变量如果是变量并不会与该列表元素建立关系(改变该列表元素不会改变自变量的值)。(例见后),修改列表,列表的元素可以修改,只要把元素引用赋值即可。 如: rec$age rec$age rec$sex rec6 rec, rec$sex rec6 rec,$name 1 “李明“ $age 1 30 $scores 1 85 76 90 $sex 1 “男“ 5 NULL 6 1 161, sex rec1 rec1 rec11= “女“ rec1 sex,第

9、五号元素因为没有定义所以其值是“NULL”,这是空对象的记号。 如果rec是一个向量,则其空元素为“NA”,这是缺失值的记号。从这里我们也可以体会“NULL”与“NA”的区别。 几个列表可以用连接函数c()连接起来,结果仍为一个列表,其元素为各自变量的列表元素。如: list.ABC - c(list.A, list.B, list.C) (注意在R中句点是名字的合法部分,一般没有特殊意义。), list.A = list(name=“李明“, age=30, scores=c(85, 76, 90) list.B = list(name=“张三“, age=27, scores=c(87,

10、91, 84) list.C = list(name=“王五“, age=28, scores=c(91, 90, 89) list.ABC list.ABC,$name 1 “李明“ $age 1 30 $scores 1 85 76 90 $name 1 “张三“ $age 1 27 $scores 1 87 91 84 $name 1 “王五“ $age 1 28 $scores 1 91 90 89,几个返回列表的函数,列表的重要作用是把相关的若干数据保存在一个数据对象中,这样在编写函数时我们就可以返回这样一个包含多项输出的列表。 因为函数的返回结果可以完整地存放在一个列表中,我们可以

11、继续对得到的结果进行分析,这是R语言比SAS灵活的一个地方。下面给出几个返回列表的例子。,一、特征值和特征向量 函数eigen(x)对对称矩阵x计算其特征值和特征向量,返回结果为一个列表,列表的两个成员(元素)为values和vectors。例如: ev ev $values 1 1.400000e+01 9.176554e-16 -1.023391e-15 $vectors ,1 ,2 ,3 1, -0.2672612 0.6067775 0.7485937 2, -0.5345225 0.5530299 -0.6390960 3, -0.8017837 -0.5709457 0.17653

12、28 特征向量按矩阵存放,每一列为一个特征向量。,二、奇异值分解及行列式 svd()函数进行奇异值分解 自学,三、最小二乘拟合与QR分解 函数lsfit(x,y)返回最小二乘拟合的结果。最小二乘的模型为线性模型 lsfit(x,y)的第一个参数x为模型中的设计阵,第二个参数y为模型中的因变量y(可以是一个向量也可以是一个矩阵),返回一个列表,成员coefficients为上面模型的最小二乘系数,成员residuals为拟合残差,成员intercept用来指示是否有截距项,成员qr为设计阵 的QR分解,它本身又是一个列表。,simu.1 - function(n, p,trueb) x -mat

13、rix(rnorm(n*p),n,p) y -x%*%trueb+rnorm(n) lsfit(x,y) #Example: n - 100 p - 3 trueb-c(-3,-2,2) simu.1(n,p,trueb),三、最小二乘拟合与QR分解 关于最小二乘拟合还可参见ls.diag() 函数(查看帮助)。 函数qr(x)返回x的QR分解结果,函数结果为一个列表,其中$qr 为一个矩阵,其上三角部分(包括对角线)分解的R矩阵,其下三角部分(不包括对角线)为分解的Q。 $qraux是Q的附加信息。, x y y $qr ,1 ,2 ,3 1, -8.1240384 -9.6011363 -

14、1.107823e+01 2, 0.4923660 0.9045340 1.809068e+00 3, 0.8616404 0.9954736 -2.220446e-16 $rank 1 2 $qraux 1 1.123091e+00 1.095039e+00 2.220446e-16 $pivot 1 1 2 3 attr(,“class“) 1 “qr“,n - 100 p - 3 trueb-c(-3,-2,2) x -matrix(rnorm(n*p),n,p) y -x%*%trueb+rnorm(n) beta-qr.coef(qr(x),y) beta Result-lsfit(

15、x,y) Result,注:,数据框(data.frame),数据框是R中类似SAS数据集的一种数据结构。它通常是矩阵形式的数据,但矩阵各列可以是不同类型的。数据框每列是一个变量,每行是一个样品的观测值。 数据框有更一般的定义。它是一种特殊的列表对象,有一个值为“data.frame”的class 属性,各列表成员必须是向量(数值型、字符型、逻辑型)、因子、数值型矩阵、列表,或其它数据框。向量、因子成员为数据框提供一个变量,如果向量非数值型则会被强制转换为因子,而矩阵、列表、数据框这样的成员为新数据框提供了和其列数、成员数、变量数相同个数的变量。作为数据框变量的向量、因子或矩阵必须具有相同的长

16、度(行数)。 尽管如此,我们一般还是可以把数据框看作是一种推广了的矩阵,它可以用矩阵形式显示,可以用对矩阵的下标引用方法来引用其元素或子集。又可看作整齐的列表。,数据框生成,数据框可以用data.frame()函数生成,其用法与list()函数相同,各自变量变成数据框的成分,自变量可以命名,成为变量名。例如: d=list(name=c(“赵“, “钱“, “孙“, “李“, “王“),age=c(20,21,22,21,20),height= c(170,171,175,165,181),gender=c(“男“, “女“, “男“, “女“, “男“ ) d name age height

17、 gender 1 赵 20 170 男 2 钱 21 171 女 3 孙 22 175 男 4 李 21 165 女 5 王 20 181 男 如果一个列表的各个成分满足数据框成分的要求,它可以用as.data.frame()函数强制转换为数据框。比如,上面的d如果先用list()函数定义成了一个列表,就可以强制成为一个数据框。 一个矩阵可以用data.frame()转换为一个数据框,如果它原来有列名则其列名被作为数据框的变量名,否则系统自动为矩阵的各列起一个变量名(如V1,V2)。, d name age height gender 1 赵 20 170 男 2 钱 21 171 女 3

18、孙 22 175 男 4 李 21 165 女 5 王 20 181 男 d1 name 1 赵 2 钱 3 孙 4 李 5 王, d1 1 赵 钱 孙 李 王 Levels: 李 钱 孙 王 赵 d22:3 1 21 22,d1-list(name=c(“赵“, “钱“, “孙“, “李“, “王“), age=c(20,21,22,21,20),height= c(170,171,175,165,181),gender=c(“男“, “女“, “男“, “女“, “男“ ) d-as.data.frame(d1),数据框引用,引用数据框元素的方法与引用矩阵元素的方法相同,可以使用下标或下标

19、向量,也可以使用名字或名字向量。如d1:2, 2:3。数据框的各变量也可以用按列表引用(即用双括号 或$符号引用)。 数据框的变量名由属性names定义,此属性一定是非空的。数据框的各行也可以定义名字,可以用rownames属性定义。如: names(d) 1 “name“ “age“ “height“ “gender“ rownames(d) 1 “1“ “2“ “3“ “4“ “5“, table(d4) 男 女 3 2 table(d4) 男 女 3 2 tapply(d3,d4, mean) 男 女 175.3333 168.0000 tapply(d3,d4, mean) 错误在ta

20、pply(d3, d4, mean) : 变元的长度必需相同 d3/d2 1 8.500000 8.142857 7.954545 7.857143 9.050000,attach()函数,数据框的主要用途是保存统计建模需要的数据。R的统计建模功能都需要以数据框为输入数据。我们也可以把数据框当成一种矩阵来处理。 在使用数据框的变量时可以用“数据框名$变量名”的记法。但是,这样使用较麻烦,R提供了attach()函数可以把数据框“链接”到内存中。例如, attach(d) r d$r - height / age这样的格式。 为了取消连接,只要调用detach()(无参数即可)。,注意:R中名字

21、空间的管理是比较独特的。它在运行时保持一个变量搜索路径表,在读取某个变量时到这个变量搜索路径表中由前向后查找,找到最前的一个;在赋值时总是在位置1赋值(除非特别指定在其它位置赋值)。 attach()的缺省位置是在变量搜索路径表的位置2 ,detach()缺省也是去掉位置2。 所以,R编程的一个常见问题是当你误用了一个自己并没有赋值的变量时有可能不出错,因为这个变量已在搜索路径中某个位置有定义,这样不利于程序的调试,需要留心。 attach()既可以链接数据框,也可以链接列表。,输入输出,输出在R交互运行时要显示某一个对象的值只要键入其名字即可 这实际上是调用了print()函数,即print

22、(x)。在非交互运行(程序)中应使用print()来输出。print()函数可以带一个digits=参数指定每个数输出的有效数字位数,可以带一个quote= 参数指定字符串输出时是否带两边的撇号,可以带一个print.gap=参数指定矩阵或数组输出时列之间的间距。如 print(pi,digits=6) print()函数是一个通用函数,即它对不同的自变量有不同的反应。对各种特殊对象如数组、模型结果等都可以规定print的输出格式。 ?print,cat()函数也用来输出,但它可以把多个参数连接起来再输出(具有paste()的功能)。例如: cat(“i = “, i, “n“) 注意使用ca

23、t()时要自己加上换行符“n”。它把各项转换成字符串,中间隔以空格连接起来,然后显示。 cat(c(“AB“, “C“), c(“E“, “F“), “n“) AB C E F 如果要使用自定义的分隔符,可以用sep=参数, 例如: cat(c(“AB“, “C“), c(“E“, “F“), “n“, sep=“) ABCEF cat()还可以指定一个参数file=给一个文件名,可以把结果写到指定的文件中,如: cat(“i = “, 1, “n“, file=“c:/work/result.txt“) # 非常适用于中间或最后结果的存储。 cat(c(“AB“, “C“), c(“E“,

24、“F“), “n“,file=“c:/result.txt“),cat()函数和print()都不具有很强的自定义格式功能,为此可以使用cat()与format() 函数配合实现。format()函数为一个数值向量找到一种共同的显示格式然后把向量转换为字符型。例如: format(c(1, 100, 10000) 1 “ 1“ “ 100“ “10000“ S-PLUS中的format()函数功能较强,具有较多的控制参数,请参见帮助。 R中目前format() 函数功能仍较弱,但R有一个formatC函数可以提供类似C语言的printf格式功能。formatC对输入向量的每一个元素单独进行格式

25、转换而不生成统一格式,例如: formatC(c(1, 0.00001) 1 “1“ “1e-05“,在formatC()函数中可以用format=参数指定C格式类型,如“d”(整数),“f”(定点实数),“e”(科学记数法),“E”, “g”(选择位数较少的输出格式),“G”, “fg”(定点实数但用digits 指定有效位数),“s”(字符串)。 可以用width指定输出宽度,用digits指定有效位数(格式为e,E,g,G,fg时)或小数点后位数(格式为f)时。可以用flag参数指定一个输出选项字符串,字符串中有“-“表示输出左对齐,有“0“表示左空白用0填充,有“+“表示要输出正负号,

26、等等。,R的输出缺省显示在交互窗口。可以用sink()函数指定一个文件以把后续的输出转向到这个文件,并可用append参数指定是否要在文件末尾附加: sink(“E:/work/result.txt“, append=TRUE) ls() d sink() 调用无参数的sink()把输出恢复到交互窗口。,write(t(x),file=文件名,nol=nol(x)把一个矩阵X以向量形式输出到文件中,把X转置后输出因为R中矩阵是列优先的,如果不转置则输出是按列输出的。如果不指定列数则缺省使用5列。文件名缺省用data. a-matrix(1:4,ncol=2) write(a,E:/amatri

27、x.txt) write(t(a), tamatrix.txt) write.table(x,file=文件名)把数据框X输出到文件中,输出包括变量名表头和行名。,输入,为了从外部文件读入一个数值型向量,R提供了scan()函数。如果指定了file参数(也是第一参数),则从指定文件读入,缺省情况下读入一个数值向量,文件中各数据以空白分隔,读到文件尾为止。例如: cat(1:12, n, file=E:/work/result.txt) x y - matrix(scan(E:/work/result.txt), ncol=3, byrow=T),实际上,scan()也能够读入一个多列的表格,只

28、要用what参数指定一个列表,则列表每项的类型为需要读取的类型。用skip参数可以跳过文件的开始若干行不读。用sep参数可以指定数据间的分隔符。详见帮助。 scan()不指定读取文件名时是交互读入,读入时用一个空行结束。 如果要读取一个数据框,R提供了一个read.table()函数。它只要给出一个文件名,就可以把文件中用空白分隔的表格数据每行读入为数据框的一行。比如,文件E:d.txt 中内容如下: Zhou 15 3 “Li Ming” 9 李明 Zhang 10.2 Wang,用read.table读入: x x V1 V2 V3 1 Zhou 15 3 2 Li Ming 9 李明 3

29、 Zhang 10.2 Wang 读入结果为数据框。 函数可以自动识别表列是数值型还是字符型,并在缺省情况下把字符型数据转换为因子(加上as.is=T可以保留字符型不转换)。 函数自动为数据框变量指定“V1 ”、“V2”和“V3”这样的变量名,指定“1”、“2”和“3”这样的行名。可以用col.names参数指定一个字符型向量作为数据框的变量名,用row.names参数指定一个字符型向量作为数据框的行名。,read.table()可以读入带有表头的文件,只要加上header=TRUE参数即可。可以用sep 参数指定表行各项的分隔符。例如,为了读入如下带有表头的逗号分隔文件E:d.csv: Name,score, cn Zhou,15,3 Li Ming, 9, 李明 Zhang, 10.2, Wang 使用如下语句: x=read.table(E:/d.csv, header=T, sep=,) x Name score cn 1 Zhou 15.0 3 2 Li Ming 9.0 李明 3 Zhang 10.2 Wang 其它一些用法见帮助。,

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 其他


经营许可证编号:宁ICP备18001539号-1