Lecture4N因子、列表、数据框及输入输出.ppt

上传人:xin****828 文档编号:15473354 上传时间:2020-08-12 格式:PPT 页数:44 大小:422.50KB
返回 下载 相关 举报
Lecture4N因子、列表、数据框及输入输出.ppt_第1页
第1页 / 共44页
Lecture4N因子、列表、数据框及输入输出.ppt_第2页
第2页 / 共44页
Lecture4N因子、列表、数据框及输入输出.ppt_第3页
第3页 / 共44页
点击查看更多>>
资源描述
实验目的,实验内容,学习S语言中离散变量、混合数据的表示方法,1、数据表示方法 2、应用实例 3、实验作业,因子、列表、数据框,因子(factor)和有序因子,统计中的变量重要类别: 区间变量和名义变量、有序变量。 区间变量取连续的数值,可以进行求和、平均等运算。 名义变量和有序变量取离散值,既可用数值表示也可取字符型值,其具体数值没有数量意义,不能用于加减乘除计算而只能用来分类或者计数。名义变量比如性别、省份、职业,有序变量比如班级名次、质量等级等。 因为离散变量有各种不同表示方法,在S中为统一起见使用因子(factor)来表示这种分类变量。还提供了有序因子(ordered factor)来表示有序变量。,因子是一种特殊的字符型向量,其中每一个元素取一组离散值中的一个,而因子对象有一个特殊属性levels表示这组离散值(用字符串表示)。例如: x y y 1 男 女 男 男 女 Levels: 男 女,函数factor()用来把一个向量编码成为一个因子。 一般形式为: factor(x, levels = sort(unique(x), na.last = TRUE), labels, exclude = NA, ordered = FALSE),可以自行指定各离散取值水平(levels),不指定时由x的不同值来求得。 labels可以用来指定各水平的标签,不指定时用各离散取值的对应字符串。 exclude参数用来指定要转换为缺失值(NA)的元素值集合。如果指定了levels,则因子的第i个元素当它等于水平中第j个时元素值取“j”,如果它的值没有出现在levels中则对应因子元素值取NA。 ordered取真值时表示因子水平是有次序的(按编码次序)。 可以用is.factor()检验对象是否因子,用as.factor()把一个向量转换成一个因子。, x=c(1,0,1,1,0) y=factor(x,levels=sort(unique(x),decreasing=T),labels=c(男, 女),exclude=NA,order=F) y 1 男 女 男 男 女 Levels: 男 女, x=c(1,0,1,1,0,2) y=factor(x,levels=c(1,0), labels=c(男, 女),exclude=NA,order=F) y 1 男 女 男 男 女 Levels: 男 女,因子的基本统计是频数统计,用函数table()来计数。 例如, sex = factor(c(男, 女, 男, 男, 女) res.tab res.tab 男 女 3 2 表示男性3人,女性2人。table()的结果是一个带元素名的向 量,元素名为因子水平,元素值为该水平出现的频数。 S的结果除了可以显示外,本身都是S对象(如这里的向量结果),可以很方便地进一步处理。 可以用两个或多个因子进行交叉分类。比如,性别(sex)和职业(job)交叉分组可以用table(sex, job)来统计每一交叉类的频数,结果为一个矩阵,矩阵带有行名和列名,分别为两个因子的各水平名。,因子可以用来作为另外的同长度变量的分类变量。比如,假设上面的sex是5个学生的性别,而 h tapply(h, sex, mean) 可以求按性别分类的身高平均值。 这样用一个等长的因子向量对一个数值向量分组的办法叫做不规则数组(ragged array)。后面我们还可以看到更多的因子的应用。,列表(list)定义,列表是一种特别的对象集合,它的元素也由序号(下标)区分,但是各元素的类型可以是任意对象,不同元素不必是同一类型。元素本身允许是其它复杂数据类型,比如,列表的一个元素也允许是列表。 列表元素用“列表名下标”的格式引用。 但是,列表不同于向量,我们每次只能引用一个元素,如rec1:2的用法是不允许的。 注意:“列表名下标”或“列表名下标范围”的用法也是合法的,但其意义与用两重括号的记法完全不同,两重记号取出列表的一个元素,结果与该元素类型相同,如果使用一重括号,则结果是列表的一个子列表(结果类型仍为列表)。, 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) mode(rec1),在定义列表时如果指定了元素的名字(如rec中的name,age,scores),则引用列表元素还可以用它的名字作为下标,格式为“列表名元素名”,如: recage 1 30 另一种格式是“列表名$元素名”,如: rec$age 1 30 其中“元素名”可以简写到与其它元素名能够区分的最短程度,比如“rec$s”可以代表 “rec$score”。 这种写法方便了交互运行,编写程序时一般不用简写,以免降低程序的可读性。,使用元素名的引用方法可以让我们不必记住某一个下标代表那一个元素,而直接用易记的元素名来引用元素。事实上,已知向量和矩阵都可以指定元素名、行名、列名。 定义列表使用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,第五号元素因为没有定义所有其值是“NULL”,这是空对象的记号。 如果rec是一个向量,则其空元素为“NA”,这是缺失值的记号。从这里我们也可以体会“NULL”与“NA”的区别。 几个列表可以用连接函数c()连接起来,结果仍为一个列表,其元素为各自变量的列表元素。如: list.ABC - c(list.A, list.B, list.C) (注意在S中句点是名字的合法部分,一般没有特殊意义。),几个返回列表的函数,列表的重要作用是把相关的若干数据保存在一个数据对象中,这样在编写函数时我们就可以返回这样一个包含多项输出的列表。 因为函数的返回结果可以完整地存放在一个列表中,我们可以继续对得到的结果进行分析,这是S比SAS灵活的一个地方。下面给出几个返回列表的例子。,一、特征值和特征向量 函数eigen(x)对对称矩阵x计算其特征值和特征向量,返回结果为一个列表,列表的两个成员(元素)为values和vectors。例如: ev=eigen(1:3)%o%(1:3) 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.1765328 特征向量按矩阵存放,每一列为一个特征向量。,二、奇异值分解及行列式 svd()函数进行奇异值分解 自学,三、最小二乘拟合与QR分解 函数lsfit(x,y)返回最小二乘拟合的结果。最小二乘的模型为线性模型 lsfit(x,y)的第一个参数x为模型中的设计阵 ,第二个参数y为模型中的因变量y(可以是一个向量也可以是一个矩阵),返回一个列表,成员coefficients为上面模型的最小二乘系数,成员residuals为拟合残差,成员intercept用来指示是否有截距项,成员qr为设计阵 的QR分解,它本身又是一个列表。,三、最小二乘拟合与QR分解 关于最小二乘拟合还可参见ls.diag() 函数(查看帮助)。 函数qr(x)返回x的QR分解结果。矩阵X的QR分解为X=Q*R ,Q为对角线元素都等于1的下三角阵,R为上三角阵。 函数结果为一个列表,成员qr 为一个矩阵,其上三角部分(包括对角线)分解的R,其下三角部分(不包括对角线)为分解的Q。其它成员为一些辅助信息。, x=rbind(c(1,2,3),c(4,5,6),c(7,8,9) y=qr(x) y qr.R(y) qr.Q(y) qr.Q(y)%*%qr.R(y), x=rbind(c(1,2,3),c(4,5,6),c(7,8,9) y=qr(x) y $qr ,1 ,2 ,3 1, -8.1240384 -9.6011363 -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, qr.R(y) ,1 ,2 ,3 1, -8.124038 -9.601136 -1.107823e+01 2, 0.000000 0.904534 1.809068e+00 3, 0.000000 0.000000 -2.220446e-16 qr.Q(y) ,1 ,2 ,3 1, -0.1230915 0.9045340 0.4082483 2, -0.4923660 0.3015113 -0.8164966 3, -0.8616404 -0.3015113 0.4082483 qr.Q(y)%*%qr.R(y) ,1 ,2 ,3 1, 1 2 3 2, 4 5 6 3, 7 8 9,数据框(data.frame),数据框是S中类似SAS数据集的一种数据结构。它通常是矩阵形式的数据,但矩阵各列可以是不同类型的。数据框每列是一个变量,每行是一个样品的观测值。 数据框有更一般的定义。它是一种特殊的列表对象,有一个值为“data.frame”的class 属性,各列表成员必须是向量(数值型、字符型、逻辑型)、因子、数值型矩阵、列表,或其它数据框。向量、因子成员为数据框提供一个变量,如果向量非数值型则会被强制转换为因子,而矩阵、列表、数据框这样的成员为新数据框提供了和其列数、成员数、变量数相同个数的变量。作为数据框变量的向量、因子或矩阵必须具有相同的长度(行数)。 尽管如此,我们一般还是可以把数据框看作是一种推广了的矩阵,它可以用矩阵形式显示,可以用对矩阵的下标引用方法来引用其元素或子集。,数据框生成,数据框可以用data.frame()函数生成,其用法与list()函数相同,各自变量变成数据框的成分,自变量可以命名,成为变量名。例如: d=data.frame(name=c(赵, 钱, 孙, 李, 王),age=c(20,21,22,21,20),height= c(170,171,175,165,181),gender=c(男, 女, 男, 女, 男 ) d 如果一个列表的各个成分满足数据框成分的要求,它可以用as.data.frame()函数强制转换为数据框。比如,上面的d如果先用list()函数定义成了一个列表,就可以强制成为一个数据框。 一个矩阵可以用data.frame()转换为一个数据框,如果它原来有列名则其列名被作为数据框的变量名,否则系统自动为矩阵的各列起一个变量名(如X1,X2)。, d name age height gender 1 赵 20 170 男 2 钱 21 171 女 3 孙 22 175 男 4 李 21 165 女 5 王 20 181 男 d1 name 1 赵 2 钱 3 孙 4 李 5 王, d1 1 赵 钱 孙 李 王 Levels: 李 钱 孙 王 赵 d22:3 1 21 22,数据框引用,引用数据框元素的方法与引用矩阵元素的方法相同,可以使用下标或下标向量,也可以使用名字或名字向量。如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) 错误在tapply(d3, d4, mean) : 变元的长度必需相同 d3/d2 1 8.500000 8.142857 7.954545 7.857143 9.050000,attach()函数,数据框的主要用途是保存统计建模需要的数据。S的统计建模功能都需要以数据框为输入数据。我们也可以把数据框当成一种矩阵来处理。 在使用数据框的变量时可以用“数据框名$变量名”的记法。但是,这样使用较麻烦,S提供了attach()函数可以把数据框“连接”入当前的名字空间。例如, attach(d) r d$r - height / age这样的格式。 为了取消连接,只要调用detach()(无参数即可)。,注意:S和R中名字空间的管理是比较独特的。它在运行时保持一个变量搜索路径表,在读取某个变量时到这个变量搜索路径表中由前向后查找,找到最前的一个;在赋值时总是在位置1赋值(除非特别指定在其它位置赋值)。 attach()的缺省位置是在变量搜索路径表的位置2 ,detach()缺省也是去掉位置2。 所以,S编程的一个常见问题是当你误用了一个自己并没有赋值的变量时有可能不出错,因为这个变量已在搜索路径中某个位置有定义,这样不利于程序的调试,需要留心。 attach()既可以连接数据框,也可以连接列表。,输入输出,输出 在S交互运行时要显示某一个对象的值只要键入其名字即可 这实际上是调用了print()函数,即print(x)。在非交互运行(程序)中应使用print()来输出。print()函数可以带一个digits=参数指定每个数输出的有效数字位数,可以带一个quote= 参数指定字符串输出时是否带两边的撇号,可以带一个print.gap=参数指定矩阵或数组输出时列之间的间距。 print()函数是一个通用函数,即它对不同的自变量有不同的反应。对各种特殊对象如数组、模型结果等都可以规定print的输出格式。,cat()函数也用来输出,但它可以把多个参数连接起来再输出(具有paste()的功能)。例如: cat(i = , i, n) 注意使用cat()时要自己加上换行符“n”。它把各项转换成字符串,中间隔以空格连接起来,然后显示。 如果要使用自定义的分隔符,可以用sep=参数,例如: cat(c(AB, C), c(E, F), n, sep=) ABCEF cat()还可以指定一个参数file=给一个文件名,可以把结果写到指定的文件中,如: cat(i = , 1, n, file=c:/work/result.txt) 非常适用于中间或最后结果的存储。,如果指定的文件已经存在则原来内容被覆盖。加上一个append=TRUE参数可以不覆盖原文件而是在文件末尾附加,这很适用于运行中的结果记录。 cat()函数和print()都不具有很强的自定义格式功能,为此可以使用cat()与format() 函数配合实现。format()函数为一个数值向量找到一种共同的显示格式然后把向量转换为字符型。例如: format(c(1, 100, 10000) 1 1 100 10000 S-PLUS中的format()函数功能较强,具有较多的控制参数,请参见帮助。 R中目前format() 函数功能仍较弱,但R有一个formatC函数可以提供类似C语言的printf格式功能。formatC对输入向量的每一个元素单独进行格式转换而不生成统一格式,例如: formatC(c(1, 10000) 1 1 1e+004,在formatC()函数中可以用format=参数指定C格式类型,如“d”(整数),“f”(定点实数),“e”(科学记数法),“E”, “g”(选择位数较少的输出格式),“G”, “fg”(定点实数但用digits 指定有效位数),“s”(字符串)。 可以用width指定输出宽度,用digits指定有效位数(格式为e,E,g,G,fg时)或小数点后位数(格式为f)时。可以用flag参数指定一个输出选项字符串,字符串中有-表示输出左对齐,有0表示左空白用0填充,有+表示要输出正负号,等等。例如,我们有一个矩阵da中保存了三个日期的年、月、日: da ,1 ,2 ,3 1, 99 1 3 2, 96 11 9 3, 65 5 18,为了输出这三个日期,可以用apply函数指定对每一行作用一个输出函数,此输出函数利用cat()和formatC来控制: apply(da, 1, function(r) cat(formatC(r1, format=d, width=2, flag=0), -, formatC(r2, format=d, width=2, flag=0), -, formatC(r3, format=d, width=2, flag=0), n, sep=) 99-01-03 96-11-09 65-05-18 NULL 这里我们知道apply函数第一个参数指定了一个矩阵,第二个参数说明对行操作还是对列操作,第三个参数是一个函数,这里我们使用了直接定义一个函数作为参数的办法。输出结果中多了一个NULL函数,这是因为我们在交互运行,apply的结果作为一个表达式的值(NULL )会被显示出来。 为避免显示,可以把结果赋给一个临时变量名,或者把整个表达式作为invisible() 函数的参数,这时不显示表达式值。,S的输出缺省显示在交互窗口。可以用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. Write.table(x,file=文件名)把数据框X输出到文件中,输出包括变量名表头和行名。,输入,为了从外部文件读入一个数值型向量,S提供了scan()函数。如果指定了file参数(也是第一参数),则从指定文件读入,缺省情况下读入一个数值向量,文件中各数据以空白分隔,读到文件尾为止。例如: cat(1:12, n, file=E:/work/result.txt) x y - matrix(scan(E:/work/result.txt), ncol=3, byrow=T),实际上,scan()也能够读入一个多列的表格,只要用what参数指定一个列表,则列表每项的类型为需要读取的类型。用skip参数可以跳过文件的开始若干行不读。用sep参数可以指定数据间的分隔符。详见帮助。 scan()不指定读取文件名时是交互读入,读入时用一个空行结束。 如果要读取一个数据框,S提供了一个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 Zhang 10.2 Wang 读入结果为数据框。 函数可以自动识别表列是数值型还是字符型,并在缺省情况下把字符型数据转换为因子(加上as.is=T可以保留字符型不转换)。 函数自动为数据框变量指定“V1 ”、“V2”这样的变量名,指定“1”、“2”这样的行名。可以用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 其它一些用法见帮助。,cl =read.table(E:/R/class.txt, as.is=c(1), col.names=c(Name, Sex, Age, Height, Weight); cat(names(cl),names(cl); class.data=read.table(E:/R/class.csv,header=T,sep=,); cat(names(class.data),names(class.data); Edata = read.table(E:/R/Employee data.csv,header=T,sep=,) cat(names(Edata),names(Edata);,read.spss package:foreign R Documentation Read an SPSS data file Description: read.spss reads a file stored by the SPSS save and export commands and returns a list. Usage: read.spss(file, use.value.labels=TRUE, to.data.frame=FALSE, max.value.labels=Inf, trim.factor.names=FALSE) Arguments: file: character variable with the name of the file to read. use.value.labels: Convert variables with value labels into R factors with those levels? to.data.frame: return a data frame? max.value.labels: Only variables with at most this many unique values will be converted to factors trim.factor.names: Trim trailing spaces from factor levels?,Details: This uses modified code from the PSPP project for reading the SPSS formats. Occasionally in SPSS value labels will be added to some values of a continuous variable (eg to distinguish different types of missing data), and you will not want these variables converted to factors. By setting max.val.labels you can specify that variables with a large number of distinct values are not converted to factors even if they have value labels. In addition, variables will not be converted to factors if there are non-missing values that have no value label. The value labels are then returned in the value.labels attribute of the variable. If SPSS variable labels are present, they are returned as the variable.labels attribute of the answer. Fixed length strings (including value labels) are padded on the right with spaces by SPSS, and so are read that way by R. See the examples for sub for ways to remove trailing spaces in string data.,Value: A list (or data frame) with one component for each variable in the saved data set. Note: If SPSS value labels are converted to factors the underlying numerical codes will not in general be the same as the SPSS numerical values, since the numerical codes in R are always 1,2,3,. Author(s): Saikat DebRoy Examples: # Not run: read.spss(datafile) # dont convert value labels to factor levels read.spss(datafile,use.value.labels=FALSE) # convert value labels to factors for variables with at most # ten distinct values. read.spss(datafile,max.val.labels=10) # End(Not run),实验作业,1、查询tapply的函数帮助信息,并用帮助文件中的案例进一步学习(自己给一个新的例子). 2、把user.txt数据中的性别、年龄、身高分别输入到S中。计算不同性别、不同年龄的人数,并计算每一组的平均身高。把这些变量组合成一个列表。把user.txt数据输入为S的数据框。 注:数据集已上传至ftp,3. 把语句x - floor(2*runif(100)所生成的向量保存到一个文本文件中,数据项分别用空格和换行分隔。然后从此文件中读入数据到向量y中。,要求:需给出程序、结果,存成word文档 星期日前发送到 ftp:/10.1.70.33 用户名:ryy 密码: ryy,
展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 图纸专区 > 课件教案


copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!