函数马赛克图片

马赛克图片  时间:2021-01-30  阅读:()

RforBeginnersChineseEdition2.
0EmmanuelParadisInstitutdesSciencesdel'EvolutionUniversiteMontpellierIIF-34095Montpelliercedex05FranceE-mail:paradis@isem.
univ-montp2.
frCo-translatedby:XFWang,YHXie,JTLiandGHDing中中中文文文版版版说说说明明明"Rforbeginners"是一本公认的经典手册,非常适合R的初学者.
英文原版初著于2002年,而此稿是基于作者在2005年重新修订的第二版.
EmmanuelParadis博士为本稿提供了原版所有LATEX源文件.
翻译工作由四名志愿者共同完成(Chap1–2:王学枫;Chap3:谢益辉;Chap4:李军焘;Chap5–7:丁国徽).
由华东师范大学汤银才老师负责本文档的编辑校订.
北京大学李东风老师审阅了全稿并提出了大量宝贵意见.
在此一并表示衷心感谢!
编译仓促,差错难免,亟盼诸R友襄正.
任何意见请通过pwxf@hotmail.
com联系我们.
译者2006年4月版权c2002,2005,EmmanuelParadisPermissionisgrantedtomakeanddistributecopies,eitherinpartorinfullandinanylanguage,ofthisdocumentonanysupportprovidedtheabovecopyrightnoticeisincludedinallcopies.
Permissionisgrantedtotranslatethisdocument,eitherinpartorinfull,inanylanguageprovidedtheabovecopyrightnoticeisincluded.
目目目录录录1导导导言言言12基基基本本本原原原理理理与与与概概概念念念32.
1基本原理32.
2对象的产生,排列及删除52.
3在线帮助73R的的的数数数据据据操操操作作作93.
1对象93.
2在文件中读写数据113.
3存储数据143.
4生成数据153.
4.
1规则序列153.
4.
2随机序列183.
5使用对象193.
5.
1创建对象193.
5.
2对象的类型转换243.
5.
3运算符263.
5.
4访问一个对象的数值:下标系统273.
5.
5访问对象的名称303.
5.
6数据编辑器323.
5.
7数学运算和一些简单的函数323.
5.
8矩阵计算344R绘绘绘图图图374.
1管理绘图374.
1.
1打开多个绘图设备374.
1.
2图形的分割384.
2绘图函数414.
3低级绘图命令424.
4绘图参数444.
5一个实例454.
6grid和lattice包495R的的的统统统计计计分分分析析析565.
1关于方差分析的一个简单例子565.
2公式585.
3泛型函数595.
4包626R编编编程程程实实实践践践656.
1循环和向量化656.
2用R写程序676.
3编写你自己的函数687R相相相关关关的的的文文文献献献721导导导言言言该手册是关于R的一个入门教材.
由于主要针对初学者,我将重点放在了对R的工作原理的解释上.
R涉及广泛,因此对于初学者来讲,了解和掌握一些基本概念及原理是很有必要的.
在打下扎实的基础后,进行更深入的学习将会变得轻松许多.
本着深入浅出的宗旨,本手册将大量配合图表等形式,尽可能使用通俗的语言,使读者容易理解而并不失细节.
R是一个有着统计分析功能及强大作图功能的软件系统,是由RossIhaka和RobertGentleman1共同创立.
R语言可以看作是由AT&T贝尔实验室所创的S语言发展出的一种方言1.
因此,R即是一种软件也可以说是一种语言.
S语言现在主要内含在由Insightful2公司经营的S-PLUS软件中.
R和S在设计理念上存在有着许多不同:关于这方面的详细内容大家可以参考Ihaka&Gentleman(1996)或R-FAQ3,该文档同时随R一起发布.
R是在GNU协议GeneralPublicLicence4下免费发行的,它的开发及维护现在则由R开发核心小组RDevelopmentCoreTeam具体负责.
R的安装文件有多种形式,有在Unix或Linux系统下所需的一些源代码(主要用C及Fortran编写),及在Windows,Linux及Macintosh上使用的预编译二进制码.
这些安装文件以及安装说明都可以在ComprehensiveRArchiveNetwork(CRAN)5网站上下载.
该网站提供的关于Linux的安装文件只适用于较新版本的Linux.
详情请参考CRAN网站.
R内含了许多实用的统计分析及作图函数.
作图函数能将产生的图片展示在一个独立的窗口中,并能将之保存为各种形式的文件(jpg,png,bmp,ps,pdf,emf,pictex,xg;具体形式取决于操作系统).
统计分析的结果也能被直接显示出来,一些中间结果(如P-值,回归系数,残差等)既可保存到专门的文件中,也可以直接用作进一步的分析.
在R语言中,使用者可以使用循环语句来连续分析多个数据集,也可将多个不同的统计函数结合在一个语句中执行更复杂的分析.
R使用者还可以借鉴网上提供的用S编写的大量程序6,而且大多数都能被R直接调用.
非专业人员起初可能觉得R相对比较复杂.
其实,R的一个非常突出的优点正是它的灵活性.
一般的软件往往会直接展示分析的结果,而R则将这些结果都存在一个对象"object"里面,所以常常在分析执行结束后并不显示任何结1IhakaR.
&GentlemanR.
1996.
R:alanguagefordataanalysisandgraphics.
JournalofComputationalandGraphicalStatistics5:299–314.
2http://www.
insightful.
com/products/splus/default.
asp3http://cran.
r-project.
org/doc/FAQ/R-FAQ.
html4Formoreinformation:http://www.
gnu.
org/5http://cran.
r-project.
org/6Forexample:http://stat.
cmu.
edu/S/1果.
使用者可能会对此感到困惑,其实这样的特点是非常有用的,因为我们可以选择的从结果中只抽出我们感兴趣的部分.
例如,我们要运行20个回归分析而只想比较其回归系数,在R中就可以选择只显示所有分析得出的回归系数,这样结果仅仅占了一排,而用有些软件可能会一下打开20个窗口.
而在下面的章节中,我们会看到更多能展示R相比传统软件更为灵活优越的例子.

22基基基本本本原原原理理理与与与概概概念念念如果R已经被安装在你的计算机中,它就能立即运行一些可执行的命令了.
R默认的命令提示符是'>',它表示正在等待输入命令.
如在Windows系统中打开Rgui.
exe,就能直接运行下拉菜单中的一些操作命令(如在线帮助,打开文件.
.
.
).
到这里,有些人可能会急着想知道更多的语句命令.
其实,在学习这些内容前,了解掌握一些R的基本工作原理是非常有必要的.
这正是本章所要讲的主要内容.
本章首先简要描述R的工作原理.
在第二节中,我将介绍一些基本的赋值分配("assign")的操作,如怎样产生对象(object),如何操作管理这些对象等.
最后简要介绍R中非常有用的在线帮助.
2.
1基基基本本本原原原理理理因为R是一种编程语言,一些对编程不太熟悉的人可能会望而却步.
这种障碍其实是完全没有必要,首先,R是一种解释型语言,而不是编译语言,也就意味着输入的命令能够直接被执行,而不需要像一些语言要首先构成一个完整的程序形式(如C,Fortan,Pascal,第二,R的语法非常之简单和直观.
例如,线性回归的命令lm(y~x)表示"以x为自变量,y为反应量来拟合一个线性模型".
合法的R函数总是带有圆括号的形式,即使括号内没有内容(如,ls()).
如果直接输入函数名而不输入圆括号,R则会自动显示该函数的一些具体内容.
在本手册中除在部分文字已作出清楚的说明外,所有的函数后都接有圆括号以区别于对象(object).

当R运行时,所有变量,数据,函数及结果都以对象(objects)的形式存在计算机的活动内存中,并冠有相应的名字代号.
我们可以通过用一些运算符(如算术,逻辑,比较等)和一些函数(其本身也是对象)来对这些对象进行操作.
运算操作非常简单,其细节将留在下章讨论(p.
26).
关于R中的函数可用下面的图例来形象的描述:arguments→options→function↑defaultarguments=result上图中的参量(argument)可能是一些对象(如数据,方程,算式.
.
.
).
有些参量在函数里被预设为缺省值,用户则可按需对其作个别的修改.
所以运行一个R函数可能不需要设定任何参量,原因是所有的参量都可以被默认为缺3省值,当然也有可能该函数本身就不含任何参量.
由于这里主要是讲述R的工作原理,对R函数的介绍将不再展开,在后面的章节中我们会看到关于构建及使用各种函数的详细内容(p.
68).
在R中进行的所有操作都是针对存储在活动内存中的对象的,因此就不涉及到任何临时文件夹的使用(Fig.
1).
对数据,结果或图表的输入与输出都是通过在对计算机硬盘中的文件读写而实现.
用户通过输入一些命令调用函数,分析得出的结果可以被直接显示在屏幕上,也可以被存入某个对象或被写入硬盘(如图片对象).
因为产生的结果本身就是一种对象,所以它们也能被视为数据并能像一般数据那样被处理分析.
数据文件即可从本地磁盘读取也可通过网络传输从远程服务器端获得.
functionsandoperators"data"objects6)XXXXXXXz"results"objects.
.
.
/library/base//stast//graphics/.
.
.
libraryoffunctionsdatales-internetPSJPEG.
.
.
keyboardmouse-commandsscreenActivememoryHarddisk图1:R工作原理示意图.
所有能使用的R函数都被包含在一个库(library)中,该库存放在磁盘的RHOME/library目录下(RHOME是最初安装R的地址).
这个目录下含有具有各种功能的包(packages),各个包也是按照目录的方式组织起来的.
其中名为base的包可以算是R的核心,因为它内嵌了R语言中所有像数据读写与操作这些最基本的函数.
在上述目录中的每个包内,都有一个子目录R,这个目录里又都含有一个与此包同名的文件(例如在包base中,有这样一个文件RHOME/library/base/R/base).
该文件正是存放所有函数的地方.
R语言中最简单的命令莫过于通过输入一个对象的名字来显示其内容了.

例如,一个名为n的对象,其内容是数值10:>n[1]10方括号中的数字1表示从n的第一个元素开始显示.
其实该命令的功能在4这里于函数print相似,输出结果与print(n)相同(但有些情况下,例如内嵌在一个函数或循环中时,就必须得用print函数).
对象的名字必须是以一个字母开头(A–Z或a–z),中间可以包含字母,数字(0–9),点(.
)及下划线().
因为R对对象的名字区分大小写,所以x和X就可以代表两个完全不同的对象(在Windows操作系统中也是如此).
2.
2对对对象象象的的的产产产生生生,,,排排排列列列及及及删删删除除除一个对象可以通过赋值操作来产生,R语言中的赋值("assign")符号一般是由一个尖括号与一个负号组成的箭头形标志.
该符号可以是从左到右的方向,也可以相反:>nn[1]15>5->n>n[1]5>xXx[1]1>X[1]10如果该对象已经存在,那么它以前的值将会自动被新值冲掉(这种修改只会影响内存中的数据,操作结果暂时不会被保存到硬盘中).
在R中给对象赋值有多种形式,可以是直接赋一个数值,也可以是一个算式或一个函数的结果:>nn[1]12>nn[1]2.
208807运行rnorm(1)将产生一个服从平均数为0标准差为1的标准正态分布的随机变量(p.
18).
当然你也可以只是输入函数或表达式而不把它的结果赋给某个对象,但如果这样在窗口中展示的结果将不会被保存到内存中:5>(10+2)*5[1]60本文中,在不影响读者理解的情况下,一些赋值符号将会被省略.
函数ls的功能是显示所有在内存中的对象:只会列出对象名,如:>namels()[1]"m""n1""n2""name"注意在R中应该用分号来隔开同一行中的不同命令语句.
如果只要显示出在名称中带有某个指定字符的对象,则通过设定选项pattern来实现(可简写为pat)):>ls(pat="m")[1]"m""name"如果进一步限为显示在名称中以某个字母开头的对象,则可:>ls(pat="^m")[1]"m"运行函数ls.
str()将会展示内存中所有对象的详细信息:>ls.
str()m:num0.
5n1:num10n2:num100name:chr"Carmen"选项pattern在这里同样适用.
在ls.
str函数中另一个非常有用的选项是max.
level,它将规定显示所有关对象信息的详细级别.
缺省情况下,ls.
str将会列出关于对象的所有信息,包括数据框,矩阵,数据列表的列数信息.
因此展示结果可能会很长.
但如果设定max.
level=-1就可以避免这种情况了:>Mls.
str(pat="M")M:'data.
frame':1obs.
of3variables:$n1:num10$n2:num100$m:num0.
5>ls.
str(pat="M",max.
level=-1)M:'data.
frame':1obs.
of3variables:要在内存中删除某个对象,可利用函数rm:运行rm(x)将会删除对象x,运行rm(x,y)将会删除对象x和y,而运行rm(list=ls())则会删除内存中的所有对象.
在上面所讲的ls()函数中的一些选项同样也可以运用到rm中来,以选择的删除一些对象,如:rm(list=ls(pat="^m")).
62.
3在在在线线线帮帮帮助助助R中给予的在线帮助能提供关于如何使用函数的非常有用的信息.
关于某个特定函数的帮助能够直接被调出来,如运行:>lm会立即显示关于函数lm()(线性模型)的帮助页面.
命令help(lm)和help("lm")具有同样的效果.
但在查询关于某特殊语法意义字符的帮助时必须用后一种形式,如:>*Error:syntaxerror>help("*")Arithmeticpackage:baseRDocumentationArithmeticOperators.
.
.
启动帮助将会打开一个页面(取决于操作系统),第一行一般会显示某函数或操作命令的所属的包(package),然后是标题,标题下面是则是一些详细信息.
Description:briefdescription.
Usage:forafunction,givesthenamewithallitsargumentsandthepossibleoptions(withthecorrespondingdefaultvalues);foranoperatorgivesthetypicaluse.
Arguments:forafunction,detailseachofitsarguments.
Details:detaileddescription.
Value:ifapplicable,thetypeofobjectreturnedbythefunctionortheoper-ator.
SeeAlso:otherhelppagescloseorsimilartothepresentone.
Examples:someexampleswhichcangenerallybeexecutedwithoutopeningthehelpwiththefunctionexample.
对初学者而言,参考帮助中Examples部分的信息是很有用的.
而一般应该仔细阅读Arguments中的一些说明也是非常有必要的.
帮助中还包含了其它一些说明部分,如Note,References或Author(s)等.
默认状态下,函数help只会在被载入内存中的包中搜索.
选项try.
all.
package在缺省值是FALSE,但如果把它设为TRUE,则可在所有包中进行搜索:7>help("bs")Nodocumentationfor'bs'inspecifiedpackagesandlibraries:youcouldtry'help.
search("bs")'>help("bs",try.
all.
packages=TRUE)Helpfortopic'bs'isnotinanyloadedpackagebutcanbefoundinthefollowingpackages:PackageLibrarysplines/usr/lib/R/library但注意在这种情况下,不会显示关于函数bs的帮助页面,如果使用者确实想打开这样的页面而所属包又没有被载入内存时,可以使用package这个选项:>help("bs",package="splines")bspackage:splinesRDocumentationB-SplineBasisforPolynomialSplinesDescription:GeneratetheB-splinebasismatrixforapolynomialspline.
.
.
.
Html格式的帮助可以通过输入下面的函数启动>help.
start()在html格式的帮助页面中还可以使用关键词进行搜索.
在SeeAlso部分中,可以通过超文本链接到其他相关函数的帮助页面.
使用关键词的搜索在R中也可以通过函数help.
search来实现.
这种方法能在所有已安装的包中搜索包含给定字符串的相关内容.
例如,运行help.
search("tree")会列出所有在帮助页面含有"tree"的函数.
注意如果有一些包是最近才安装的,应该首先使用函数help.
search中的rebuild选项来刷新数据库(e.
g.
,help.
search("tree",rebuild=TRUE)).
使用函数apropos则能找出所有在名字中含有指定字符串的函数,但只会在被载入内存中的包中进行搜索:>apropos(help)[1]"help"".
helpForCall""help.
search"[4]"help.
start"83R的的的数数数据据据操操操作作作3.
1对对对象象象我们已经看到R通过一些对象来运行,当然首先这些对象是用它们的名称和内容来刻画的,其次也通过对象的数据类型即属性来刻画.
为了理解这些属性的用处,我们以一个在{1,2,3}中取值的变量为例:这个变量可以是一个整数变量(例如巢中蛋的个数),或者也可以是一个分类变量的编码(例如某些甲壳类动物的三种性别:雄、雌和雌雄同体).
显然对这个变量的统计分析在以上两例中将是不相同的,对象的属性在R中提供着所需的信息.
更技术性也更一般地说,对于作用于一个对象的函数,其表现将取决于对象的属性.
所有的对象都有两个内在属性:类型和长度.
类型是对象元素的基本种类,共有四种:数值型,字符型,复数型7和逻辑型(FALSE或TRUE),虽然也存在其它的类型,但是并不能用来表示数据,例如函数或表达式;长度是对象中元素的数目.
对象的类型和长度可以分别通过函数mode和length得到.
>xmode(x)[1]"numeric">length(x)[1]1>Amode(A);mode(compar);mode(z)[1]"character"[1]"logical"[1]"complex"无论什么类型的数据,缺失数据总是用NA(不可用)来表示;对很大的数值则可用指数形式表示:>NN[1]2.
1e+23R可以正确地表示无穷的数值,如用Inf和-Inf表示±∞,或者用NaN(非数字)表示不是数字的值.
7本手册中不讨论复数型9>xx[1]Inf>exp(x)[1]Inf>exp(-x)[1]0>x-x[1]NaN字符型的值输入时须加上双引号",如果需要引用双引号的话,可以让它跟在反斜杠\后面;这两个字符合一起\"在某些函数如cat的输出显示或write.
table写入磁盘(参见p.
14,函数的qmethod选项)时会被以特殊的方式处理.
>xx[1]"Doublequotes\"delimitateR'sstrings.
">cat(x)Doublequotes"delimitateR'sstrings.
也有另一种表示字符型变量的方法,即用单引号(')来界定变量,这种情况下不需要用反斜杠来引用双引号(但是引用单引号时必须要用!
)>xx[1]"Doublequotes\"delimitateR'sstrings.
"下表给出了表示数据的对象的类别概览:对对对象象象类类类型型型是是是否否否允允允许许许同同同一一一个个个对对对象象象中中中有有有多多多种种种类类类型型型向量数值型,字符型,复数型,或逻辑型否因子数值型或字符型否数组数值型,字符型,复数型,或逻辑型否矩阵数值型,字符型,复数型,或逻辑型否数据框数值型,字符型,复数型,或逻辑型是时间序列(ts)数值型,字符型,复数型,或逻辑型否列表数值型,字符型,复数型,逻辑型,是函数,表达式,.
.
.
10向量是一个变量,其意思也即人们通常认为的那样;因子是一个分类变量;数组是一个k维的数据表;矩阵是数组的一个特例,其维数k=2.
注意,数组或者矩阵中的所有元素都必须是同一种类型的;数据框是由一个或几个向量和(或)因子构成,它们必须是等长的,但可以是不同的数据类型;"ts"表示时间序列数据,它包含一些额外的属性,例如频率和时间;列表可以包含任何类型的对象,包括列表!
对于一个向量,用它的类型和长度足够描述数据;而对其它的对象则另需一些额外信息,这些信息由外在的属性给出.
这些属性中的是表示对象维数的dim,比如一个2行2列的的矩阵,它的dim是一对数值[2,2],但是其长度是4.
3.
2在在在文文文件件件中中中读读读写写写数数数据据据对于在文件读取和写入的工作,R使用工作目录来完成.
可以使用命令getwd()(获得工作目录)来找到目录,使用命令setwd("C:/data")或者setwd("/home/paradis/R")来改变目录.
如果一个文件不在工作目录里则必须给出它的路径8.
R可以用下面的函数读取存储在文本文件(ASCII)中的数据:read.
table(其中有若干参数,见后文),scan和read.
fwf.
R也可以读取以其他格式的文件(Excel,SAS,SPSS,和访问SQL类型的数据库,但是基础包中并不包含所需的这些函数.
这些功能函数对于R的高级应用是十分有用的,但是我们在这里将读取文件限定在ASCII格式.
函数read.
table用来创建一个数据框,所以它是读取表格形式的数据的主要方法.
举例来说,对于一个名为data.
dat的文件,命令:>mydatamydatamydatamydataV1V2V31A1.
501.
22A1.
551.
33B1.
601.
44B1.
651.
55C1.
701.
66C1.
751.
73.
3存存存储储储数数数据据据函数write.
table可以在文件中写入一个对象,一般是写一个数据框,也可以是其它类型的对象(向量,矩阵.
.
.
).
参数和选项:write.
table(x,file="",append=FALSE,quote=TRUE,sep="",eol="\n",na="NA",dec=".
",row.
names=TRUE,col.
names=TRUE,qmethod=c("escape","double"))14x要写入的对象的名称file文件名(缺省时对象直接被"写"在屏幕上)append如果为TRUE则在写入数据时不删除目标文件中可能已存在的数据,采取往后添加的方式quote一个逻辑型或者数值型向量:如果为TRUE,则字符型变量和因子写在双引号""中;若quote是数值型向量则代表将欲写在""中的那些列的列标.
(两种情况下变量名都会被写在""中;若quote=FALSE则变量名不包含在双引号中)sep文件中的字段分隔符eol使用在每行最后的字符("\n"表示回车)na表示缺失数据的字符dec用来表示小数点的字符row.
names一个逻辑值,决定行名是否写入文件;或指定要作为行名写入文件的字符型向量col.
names一个逻辑值(决定列名是否写入文件);或指定一个要作为列名写入文件中的字符型向量qmethod若quote=TRUE,则此参数用来指定字符型变量中的双引号"如何处理:若参数值为"escape"(或者"e",缺省)每个"都用\"替换;若值为"d"则每个"用""替换若想用更简单的方法将一个对象写入文件,可以使用命令write(x,file="data.
txt"),其中x是对象的名字(它可以是向量,矩阵,或者数组).
这里有两个选项:nc(或者ncol),用来定义文件中的列数(在缺省情况下,如果x是字符型数据,则nc=1;对于其它数据类型nc=5),和append(一个逻辑值),若为TRUE则添加数据时不删除那些可能已存在在文件中的数据;若为FALSE(缺省值)则删除文件中已存在的数据.
要记录一组任意数据类型的对象,我们可以使用命令save(x,y,z,file="xyz.
RData").
可以使用选项ASCII=TRUE使得数据在不同的机器之间更简易转移.
数据(用R的术语来说叫做工作空间)可以在使用load("xyz.
RData")之后被加载到内存中.
函数save.
image()是save(list=ls(all=TRUE),file=".
RData")的一个简捷方式.
3.
4生生生成成成数数数据据据3.
4.
1规规规则则则序序序列列列例如一个从1到30的规则整数序列,可以这样产生:>x1:10-1[1]0123456789>1:(10-1)15[1]123456789函数seq可以生成如下的实数序列:>seq(1,5,0.
5)[1]1.
01.
52.
02.
53.
03.
54.
04.
55.
0其中第一个数字表示序列的起点,第二个表示终点,第三个是生成序列的步长.
也可以这样使用:>seq(length=9,from=1,to=5)[1]1.
01.
52.
02.
53.
03.
54.
04.
55.
0还可以用函数c直接输入数值:>c(1,1.
5,2,2.
5,3,3.
5,4,4.
5,5)[1]1.
01.
52.
02.
53.
03.
54.
04.
55.
0如果想用键盘输入一些数据也是可以的,只需要直接使用默认选项的scan函数:>zz[1]1.
01.
52.
02.
53.
03.
54.
04.
55.
0函数rep用来创建一个所有元素都相同的向量:>rep(1,30)[1]111111111111111111111111111111函数sequence创建一系列连续的整数序列,每个序列都以给定参数的数值结尾:>sequence(4:5)[1]123412345>sequence(c(10,5))[1]1234567891012345函数gl(生成不同的水平/层次数据)十分有用,因为它能产生规则的因子序列.
这个函数的用法是gl(k,n),其中k是水平数(或类别数),n是每个水平重复的次数.
此函数有两个选项:length用来指定产生数据的个数,labels用来指定每个水平因子的名字.
例如:16>gl(3,5)[1]111112222233333Levels:123>gl(3,5,length=30)[1]111112222233333111112222233333Levels:123>gl(2,6,label=c("Male","Female"))[1]MaleMaleMaleMaleMaleMale[7]FemaleFemaleFemaleFemaleFemaleFemaleLevels:MaleFemale>gl(2,10)[1]11111111112222222222Levels:12>gl(2,1,length=20)[1]12121212121212121212Levels:12>gl(2,2,length=20)[1]11221122112211221122Levels:12最后,expand.
grid()创建一个数据框,结果是把各参数的各水平完全搭配:>expand.
grid(h=c(60,80),w=c(100,300),sex=c("Male","Female"))hwsex160100Male280100Male360300Male480300Male560100Female680100Female760300Female880300Female173.
4.
2随随随机机机序序序列列列分分分布布布名名名称称称函函函数数数Gaussian(normal)rnorm(n,mean=0,sd=1)exponentialrexp(n,rate=1)gammargamma(n,shape,scale=1)Poissonrpois(n,lambda)Weibullrweibull(n,shape,scale=1)Cauchyrcauchy(n,location=0,scale=1)betarbeta(n,shape1,shape2)'Student'(t)rt(n,df)Fisher–Snedecor(F)rf(n,df1,df2)Pearson(χ2)rchisq(n,df)binomialrbinom(n,size,prob)multinomialrmultinom(n,size,prob)geometricrgeom(n,prob)hypergeometricrhyper(nn,m,n,k)logisticrlogis(n,location=0,scale=1)lognormalrlnorm(n,meanlog=0,sdlog=1)negativebinomialrnbinom(n,size,prob)uniformrunif(n,min=0,max=1)Wilcoxon'sstatisticsrwilcox(nn,m,n),rsignrank(nn,n)在统计学中,产生随机数据是很有用的,R可以产生多种不同分布下的随机数序列.
这些分布函数的形式为rfunc(n,p1,p2,.
.
.
),其中func指概率分布函数,n为生成数据的个数,p1,p2,.
.
.
是分布的参数数值.
上面的表给出了每个分布的详情和可能的缺省值(如果没有给出缺省值,则意味着用户必须指定参数).
大多数这种统计函数都有相似的形式,只需用d、p或者q去替代r,比如密度函数(dfunc(x,.
.
.
)),累计概率密度函数(也即分布函数)(pfunc(x,.
.
.
))和分位数函数(qfunc(p,.
.
.
),0qnorm(0.
025)[1]-1.
959964>qnorm(0.
975)[1]1.
959964对于同一个检验的单侧临界值,根据备择假设的形式使用qnorm(0.
05)或1-qnorm(0.
95).
18一个检验的P值,比如自由度df=1的χ2=3.
84:>1-pchisq(3.
84,1)[1]0.
050043523.
5使使使用用用对对对象象象3.
5.
1创创创建建建对对对象象象我们在前面看到了用赋值操作创建对象的不同方法;在这样的创建中对象的数据类型和模式通常都已经预先确定了.
在创建一个对象时是有可能指定它的数据类型、长度、类别等等的.
从处理对象的角度来看这些方法是很有趣的.
举例来说,我们可以创建一个空的对象并且逐步修改其中的元素,这比把所有的元素一起用c()放进去更有效.
在这里也可以使用下标系统,后面我们将会看到(p.
27).
从一些对象创建其它对象也是很方便的,比如,若想拟合一系列线性模型,可以将这一系列模型的公式放在一个列表中,然后不断地取出元素(即那些公式)插入到函数lm中.
在这个R的学习阶段,我们很有必要了解下面的函数和数据结构.
直接创建数据结构不仅能让我们对数据有更好的理解,而且也会更深入地领会前文中提到的一些概念.
向向向量量量(((Vector)))函数vector有两个参数:类型(mode)和长度(length),创建的向量中元素值取决于参数所指定的数据类型:数值型向量则元素值都为0,逻辑型都为FALSE,字符型都为"".
以下三个函数有几乎相同的效果(创建一个向量)并且只有一个参数即长度:numeric(),logical(),和character().
因因因子子子(((Factor)))一个因子不仅包括分类变量本身还包括变量不同的可能水平(即使它们在数据中不出现).
因子函数factor用下面的选项创建一个因子:factor(x,levels=sort(unique(x),na.
last=TRUE),labels=levels,exclude=NA,ordered=is.
ordered(x))levels用来指定因子可能的水平(缺省值是向量x中互异的值);labels用来指定水平的名字;exclude表示从向量x中剔除的水平值;ordered是一个逻辑型选项用来指定因子的水平是否有次序.
回想数值型或字符型的x.
下面有一些例子:>factor(1:3)[1]12319Levels:123>factor(1:3,levels=1:5)[1]123Levels:12345>factor(1:3,labels=c("A","B","C"))[1]ABCLevels:ABC>factor(1:5,exclude=4)[1]123NA5Levels:1235函数levels用来提取一个因子中可能的水平值:>ffff[1]24Levels:2345>levels(ff)[1]"2""3""4""5"矩矩矩阵阵阵(((Matrix)))一个矩阵实际上是有一个附加属性(维数dim)的向量,维数即为一个长度为2的向量,用来指定矩阵的行数和列数.
一个矩阵可以用函数matrix来创建:matrix(data=NA,nrow=1,ncol=1,byrow=FALSE,dimnames=NULL)选项byrow表示数据给出的值是要按列填充(缺省值)还是按行填充(如果为TRUE).
可以通过选项dimnames给行列命名.
>matrix(data=5,nr=2,nc=2)[,1][,2][1,]55[2,]55>matrix(1:6,2,3)[,1][,2][,3][1,]135[2,]246>matrix(1:6,2,3,byrow=TRUE)[,1][,2][,3][1,]123[2,]45620另一种创建矩阵的方法是给维数适当的赋值(初始值为NULL):>xx[1]123456789101112131415>dim(x)NULL>dim(x)x[,1][,2][,3][1,]1611[2,]2712[3,]3813[4,]4914[5,]51015数数数据据据框框框(((Dataframe)))前面我们已经看到一个数据框可以由函数read.
table间接创建;这里也可以用函数data.
frame来创建.
数据框中的向量必须有相同的长度,如果其中有一个比其它的短,它将"循环"整数次(以使得其长度与其它向量相同):>xdata.
frame(x,n)xn1110221033104410>data.
frame(x,M)xM1110223533104435>data.
frame(x,y)Errorindata.
frame(x,y):argumentsimplydifferingnumberofrows:4,3如果一个因子包含在一个数据框中,它必须和其中的向量有相同的长度.
列名也是可以改变的,例如,data.
frame(A1=x,A2=n).
用户也21可以使用row.
names给行命名,但是,这个命名向量必须是字符型的而且长度等于这个数据框的行数.
最后,注意数据框和矩阵一样有维数这个属性.
列列列表表表(((List)))列表可以用list函数创建,方法与创建数据框类似.
它对其中包含的对象没有什么限制.
和data.
frame()比较,缺省值没有给出对象的名称;用前面的向量x和y举例:>L1L1[[1]][1]1234[[2]][1]234>L2$A[1]1234$B[1]234>names(L1)NULL>names(L2)[1]"A""B"时时时间间间序序序列列列(((Time-series)))函数ts可以由向量(一元时间序列)或者矩阵(多元时间序列)创建一个ts型对象,并且有一些表明序列特征的选项(带有缺省值),它们是:ts(data=NA,start=1,end=numeric(0),frequency=1,deltat=1,ts.
eps=getOption("ts.
eps"),class,names)22data一个向量或者矩阵start第一个观察值的时间,为一个数字或者是一个由两个整数构成的向量(参见下面的例子)end最后一个观察值的时间,指定方法和start相同frequency单位时间内观察值的频数(频率)deltat两个观察值间的时间间隔(例如,月度数据的取值为1/12);frequency和deltat必须并且只能给定其中之一ts.
eps序列之间的误差限.
如果序列之间的频率差异小于ts.
eps则认为这些序列的频率相等.

class对象的类型;一元序列的缺省值是"ts",多元序列的缺省值是c("mts","ts")names一个字符型向量,给出多元序列中每个一元序列的名称;缺省为data中每列数据的名称或者Series1,Series2,.
.
.
用ts创建时间序列的一些例子:>ts(1:10,start=1959)TimeSeries:Start=1959End=1968Frequency=1[1]12345678910>ts(1:47,frequency=12,start=c(1959,2))JanFebMarAprMayJunJulAugSepOctNovDec19591234567891011196012131415161718192021222319612425262728293031323334351962363738394041424344454647>ts(1:10,frequency=4,start=c(1959,2))Qtr1Qtr2Qtr3Qtr419591231960456719618910>ts(matrix(rpois(36,5),12,3),start=c(1961,1),frequency=12)Series1Series2Series3Jan1961854Feb1961669Mar196123323Apr1961854May1961493Jun19614613Jul1961426Aug19611164Sep1961657Oct1961657Nov1961557Dec1961852表表表达达达式式式(((Expression)))表达式类型的对象在R中有着很基础的地位,是R能够解释的字符序列.
所有有效的命令都是表达式.
一个命令被直接从键盘输入后,它将被R求值,如果是有效的则会被执行.
在很多情况下,构造一个不被求值的表达式是很有用的:这就是函数expresssion要做的.
当然也可以随后用eval()对创建的表达式进行求值.
>xexp1exp1expression(x/(y+exp(z)))>eval(exp1)[1]0.
5749019表达式也可以在其它地方用来在图表中添加公式(p.
43);表达式可以由字符型变量创建;一些函数把表达式当作参数,例如可以求偏导数的函数D.
>D(exp1,"x")1/(y+exp(z))>D(exp1,"y")-x/(y+exp(z))^2>D(exp1,"z")-x*exp(z)/(y+exp(z))^23.
5.
2对对对象象象的的的类类类型型型转转转换换换读者必然会发现一些类型的对象之间的差异是很小的;因此改变一个对象的某些属性使它转换为另一种类型的对象是合乎逻辑的.
as.
something这种形式的函数可以完成转换.
R(2.
1.
0版)的base和utils包中有98个这种函数在里面,所以我们在这里不做深入的阐述.
24很明显转换取决于被转换对象的属性.
一般来说,转换遵循一些很直观的规则.
对于类型的不同转换,下表总结了不同的情况.
转转转换换换目目目标标标函函函数数数规规规则则则数值型as.
numericFALSE→0TRUE→1"1","2"1,2,.
.
.
"A"NA逻辑型as.
logical0→FALSE其它数字→TRUE"FALSE","F"→FALSE"TRUE","T"→TRUE其它字符→NA字符型as.
character1,2,1","2",.
.
.
FALSE→"FALSE"TRUE→"TRUE"有许多函数可以用来转换对象的类型(as.
matrix,as.
ts,as.
data.
frame,as.
expression,这些函数在转换时会影响除了类型之外的属性,将得到的结果在一般情况下也是容易预见的.
将因子转换为数值型是R中经常遇到的情况,这种情况下R将因子的水平转化为数值编码:>facfac[1]110Levels:110>as.
numeric(fac)[1]12这对于一个字符型因子来说是很有意义的:>fac2fac2[1]MaleFemaleLevels:FemaleMale>as.
numeric(fac2)[1]21注意这个结果可能不像根据上面表格预期的那样是NA.
要想将一个数值型因子转换为一个数值型向量并且保持最初指定的水平值,就必须先转换成字符型然后再转换成数值型.
25>as.
numeric(as.
character(fac))[1]110当一个文件中的数值型变量具有非数值的值时,这种做法就很有用;前面我们已经看到了read.
table()在缺省情况下会读取这列为一个因子.
3.
5.
3运运运算算算符符符我们在前面已经看到了R10中三种主要类型的运算符.
下面是运算符的列表:运运运算算算符符符数学运算比较运算逻辑运算+加法大于x&y逻辑与*乘法=大于或等于x|y逻辑或^乘方==等于x||y同上%%模!
=不等于xor(x,y)异或%/%整除数学运算符和比较运算符作用于两个元素上(x+y,ax0xx==y[1]TRUETRUETRUE>identical(x,y)[1]TRUE>all.
equal(x,y)[1]TRUEidentical比较数据的内在关系,如果对象是严格相同的返回TRUE,否则返回FALSE.
all.
equal用来判断两个对象是否"近似相等",返回结果为TRUE或者对二者差异的描述.
后一个函数在比较数值型变量时考虑到了计算过程中的近似.
在计算机中数值型变量的比较有时很是令人惊奇.
>0.
9==(1-0.
1)[1]TRUE>identical(0.
9,1-0.
1)[1]TRUE>all.
equal(0.
9,1-0.
1)[1]TRUE>0.
9==(1.
1-0.
2)[1]FALSE>identical(0.
9,1.
1-0.
2)[1]FALSE>all.
equal(0.
9,1.
1-0.
2)[1]TRUE>all.
equal(0.
9,1.
1-0.
2,tolerance=1e-16)[1]"Meanrelativedifference:1.
233581e-16"3.
5.
4访访访问问问一一一个个个对对对象象象的的的数数数值值值:::下下下标标标系系系统统统下标系统可以用来有效、灵活且有选择性地访问一个对象中的元素;下标可以是数值型的或逻辑型的.
举例来说,要访问向量x中的第3个值,我们只要输入x[3]就可以获取或改变这个值:>xx[3][1]3>x[3]x[1]122045下标本身也可以是一个数值型向量:>ix[i][1]120如果x是一个矩阵或者数据框,第i行第j列的值可以通过x[i,j]来访问.
要访问一个给定的行或列中所有的值,只要忽略适当的下标(不要忘记逗号!
):>xx[,1][,2][,3][1,]135[2,]246>x[,3]x[,1][,2][,3][1,]1321[2,]2422>x[,3][1]2122读者必然注意到了最后一个结果是一个向量而不是一个矩阵.
R的缺省规则是返回一个维数尽可能低的对象.
这可以通过修改选项drop的值来改变,它的缺省值是TRUE:>x[,3,drop=FALSE][,1][1,]21[2,]22下标系统也普遍适用于数组,使用和数组维数同样多的下标(例如,一个三维数组:x[i,j,k],x[,,3],x[,,3,drop=FALSE],等等).
记住下标必须使用方括号,而圆括号是用来指定函数的参数的:>x(1)Error:couldn'tfindfunction"x"28通过使用负数下标也可以用来不显示一个或一些行或列.
比如,x[-1,]将不显示第一行,x[-c(1,15),]将不显示第1到第15行.
使用上面定义的矩阵:>x[,-1][,1][,2][1,]321[2,]422>x[,-(1:2)][1]2122>x[,-(1:2),drop=FALSE][,1][1,]21[2,]22对于向量,矩阵和数组,可以用一个比较运算表达式作为下标来访问元素的值:>xx[x>=5]x[1]1234202020202020>x[x==1]x[1]25234202020202020下面是使用逻辑型下标的一种应用(选择一个整数变量中的偶数):>xx[1]594776451135715392252[21]46654534333773814214>x[x%%2==0][1]464222466448424在上面的例子中,下标系统使用了比较运算符返回的逻辑值.
这些逻辑值可以被预先计算,如果需要,将循环使用:>xsx[s][1]24681012141618202224262830323436384029逻辑下标也可以在数据框中使用,但是要注意数据框中不同的列可能有不同的数据类型.
对于列表,访问不同的元素(可以是任何类型的对象)可以通过单一的或者双重的方括号来实现;它们的区别是:单个括号返回一个列表,而双重括号将提取列表中的对象.
在得到的结果中也可以使用下标,就像之前在向量、矩阵等情况中看到的那样.
例如,一个列表中的第3个对象是一个向量,它的取值可以使用my.
list[[3]][i]来访问,如果是一个三维数组则使用my.
list[[3]][i,j,k]等等;另一个区别是my.
list[1:2]将返回一个列表,包含原始列表的第1个和第2个元素,而my.
list[[1:2]]不会给出期望的结果.
3.
5.
5访访访问问问对对对象象象的的的名名名称称称names是一个对象元素的字符型标签,它们一般情况下是可选的属性,名称有多个种类(names,colnames,rownames,dimnames).
names是一个和对象有同样长度的向量并且可以通过函数names来访问.
>xnames(x)NULL>names(x)xabc123>names(x)[1]"a""b""c">names(x)x[1]123对于矩阵和数据框,colnames和rownames分别是列和行的标签.
它们可以通过各自的函数来访问,或者通过dimnames返回包含两个名称向量的列表.
>Xrownames(X)colnames(X)Xcda13b24>dimnames(X)30[[1]][1]"a""b"[[2]][1]"c""d"对于数组,可以用dimnames来访问各维的名字:>AA,,1[,1][,2][1,]13[2,]24,,2[,1][,2][1,]57[2,]68>dimnames(A)A,,ecda13b24,,fcda57b68如果一个对象的元素有名称,它们可以通过名称被提取,和使用下标一样.
实际上,因为原始对象的属性将仍被保留,所以这里的"提取"应该叫作"取子集"更合适.
例如,如果数据框DF包含变量x,y和z,命令DF["x"]将返回一个只包含x的数据框;DF[c("x","y")]将返回包含两个变量的数据框.
如果列表中的对象有名称,这种方法也将在列表中起作用.

31就像读者必然认识到的那样,在这里使用的下标是一个字符型向量.
就像在前面看到的数值型或逻辑型向量那样,这个向量可以被预先定义然后用来提取相应的值.
要从一个数据框中提取一个向量或者一个因子,可以使用运算符$(例如DF$x),这对列表同样有效.

3.
5.
6数数数据据据编编编辑辑辑器器器我们可以使用一个类似于电子表格的图形编辑器去编辑一个"数据"对象.
例如,如果X是一个矩阵,命令data.
entry(X)将打开一个图形编辑器并且可以通过点击适当的单元格修改数值或者添加新的行或列.
函数data.
entry可以直接修改作为其参数给出的对象,而不需要对其结果赋值.
另一方面,函数de可以返回一个列表,其中包含作为函数参数给出的原始对象(可能已被修改过).
在缺省情况下这个结果被输出在屏幕上,但是,像对大多数函数一样,它也可以被赋值给一个对象.
使用数据编辑器的具体情况取决于操作系统.
3.
5.
7数数数学学学运运运算算算和和和一一一些些些简简简单单单的的的函函函数数数在R中有很多用来处理数据的函数,前面我们已经看到了最简单的一个函数c,它用来连接列在圆括号中的对象.
如:>c(1:5,seq(10,11,0.
2))[1]1.
02.
03.
04.
05.
010.
010.
210.
410.
610.
811.
0向量可以进行那些常规的算术运算:>xyzz[1]2345不同长度的向量可以相加,这种情况下最短的向量将被循环使用.
例如:>xyzz[1]2446>xyzz[1]244注意R返回了一个警告消息而不是一个错误消息,因此这个操作实际上是被执行了的.
如果我们想要对于一个向量中所有的元素加(或乘)相同的数值:>xazz[1]10203040R中用来处理数据的函数太多了而不能全部列在这里.
读者可以找到所有的基本数学函数(log,exp,log10,log2,sin,cos,tan,asin,acos,atan,abs,sqrt,专业函数(gamma,digamma,beta,besselI,同样包括各种统计学中有用的函数.
下表中列出了一部分函数:sum(x)对x中的元素求和prod(x)对x中的元素求连乘积max(x)x中元素的最大值min(x)x中元素的最小值which.
max(x)返回x中最大元素的下标which.
min(x)返回x中最小元素的下标range(x)与c(min(x),max(x))作用相同length(x)x中元素的数目mean(x)x中元素的均值median(x)x中元素的中位数var(x)orcov(x)x中元素的的方差(用n1做分母);如果x是一个矩阵或者一个数据框,将计算协方差阵cor(x)如果x是一个矩阵或者一个数据框则计算相关系数矩阵(如果x是一个向量则结果是1)var(x,y)orcov(x,y)x和y的协方差,如果是矩阵或数据框则计算x和y对应列的协方差cor(x,y)x和y的线性相关系数,如果是矩阵或者数据框则计算相关系数矩阵.
这些函数一般返回标量(即为长度为1的向量),只有range返回一个长度33为2的向量,var,cov,和cor可能会返回一个矩阵.
下面的函数返回更复杂的结果.
round(x,n)将x中的元素四舍五入到小数点后n位rev(x)对x中的元素取逆序sort(x)将x中的元素按升序排列;要按降序排列可以用命令rev(sort(x))rank(x)返回x中元素的秩log(x,base)计算以base为底的x的对数值scale(x)如果x是一个矩阵,则中心化和标准化数据;若只进行中心化则使用选项scale=FALSE,只进行标准化则center=FALSE(缺省值是center=TRUE,scale=TRUE)pmin(x,y,.
.
.
)返回一个向量,它的第i个元素是x[i],y[i]中最小值pmax(x,y,.
.
.
)同上,取最大值cumsum(x)返回一个向量,它的第i个元素是从x[1]到x[i]的和cumprod(x)同上,取乘积cummin(x)同上,取最小值cummax(x)同上,取最大值match(x,y)返回一个和x的长度相同的向量,表示x中与y中元素相同的元素在y中的位置(没有则返回NA)which(x==a)返回一个包含x符合条件(当比较运算结果为真(TRUE)的下标的向量,在这个结果向量中数值i说明x[i]==a(这个函数的参数必须是逻辑型变量)choose(n,k)计算从n个样本中选取k个的组合数na.
omit(x)忽略有缺失值(NA)的观察数据(如果x是矩阵或数据框则忽略相应的行)na.
fail(x)如果x包含至少一个NA则返回一个错误消息unique(x)如果x是一个向量或者数据框,则返回一个类似的对象但是去掉所有重复的元素(对于重复的元素只取一个)table(x)返回一个表格,给出x中重复元素的个数列表(尤其对于整数型或者因子型变量)table(x,y)x与y的列联表subset(x,.
.
.
)返回x中的一个满足特定条件.
.
.
的子集,该条件通常是进行比较运算:x$V1m1m2rbind(m1,m2)[,1][,2][1,]11[2,]11[3,]22[4,]22>cbind(m1,m2)[,1][,2][,3][,4][1,]1122[2,]1122两矩阵乘积的运算符是"%*%",例如,对上面的矩阵m1和m2:>rbind(m1,m2)%*%cbind(m1,m2)[,1][,2][,3][,4][1,]2244[2,]2244[3,]4488[4,]4488>cbind(m1,m2)%*%rbind(m1,m2)[,1][,2][1,]1010[2,]1010矩阵的转置由函数t完成;这个函数也可以作用于数据框.
函数diag可以用来提取或修正一个矩阵的对角元,或者创建一个对角矩阵.
>diag(m1)[1]11>diag(rbind(m1,m2)%*%cbind(m1,m2))[1]2288>diag(m1)m1[,1][,2][1,]101[2,]110>diag(3)[,1][,2][,3][1,]10035[2,]010[3,]001>vdiag(v)[,1][,2][,3][1,]1000[2,]0200[3,]0030>diag(2.
1,nr=3,nc=5)[,1][,2][,3][,4][,5][1,]2.
10.
00.
000[2,]0.
02.
10.
000[3,]0.
00.
02.
100R中也有一些用于矩阵计算的专门的函数.
我们可以使用solve求矩阵的逆,用qr来分解矩阵,用eigen来计算特征值和特征向量,用svd来做奇异值分解.
364R绘绘绘图图图R提供非常多样的绘图功能.
如想了解,可以输入:demo(graphics)或者demo(persp).
我们在这里不可能详细说明R在绘图方面的所有功能,主要是因为每个绘图函数都有大量的选项使得图形的绘制十分的灵活多变.

御云(RoyalYun):香港CN2 GIA VPS仅7.9元每月起,美国vps仅8.9/月,续费同价,可叠加优惠

御云怎么样?炎炎暑期即将来临,御云(royalyun)香港、美国服务器开启大特惠模式。御云是新成立的云服务提供商,主要提供香港、美国的云服务器,不久将开启虚拟主机业务。我们的香港和美国主机采用CN2 GIA线路。目前,香港cn2 gia vps仅7.9元每月起,美国vps仅8.9/月,续费同价,可叠加优惠,香港云服务器国内延迟一般在50ms左右,是搭建网站的最佳选择,但是请不要用于违法用途。点击进...

久久网云-目前最便宜的国内,香港,美国,日本VPS云服务器19.9元/月起,三网CN2,2天内不满意可以更换其他机房机器,IP免费更换!。

久久网云怎么样?久久网云好不好?久久网云是一家成立于2017年的主机服务商,致力于为用户提供高性价比稳定快速的主机托管服务,久久网云目前提供有美国免费主机、香港主机、韩国服务器、香港服务器、美国云服务器,香港荃湾CN2弹性云服务器。专注为个人开发者用户,中小型,大型企业用户提供一站式核心网络云端服务部署,促使用户云端部署化简为零,轻松快捷运用云计算!多年云计算领域服务经验,遍布亚太地区的海量节点为...

PhotonVPS:美国Linux VPS半价促销2.5美元/月起,可选美国洛杉矶/达拉斯/芝加哥/阿什本等四机房

photonvps怎么样?photonvps现在针对旗下美国vps推出半价促销优惠活动,2.5美元/月起,免费10Gbps DDoS防御,Linux系统,机房可选美国洛杉矶、达拉斯、芝加哥、阿什本。以前觉得老牌商家PhotonVPS贵的朋友可以先入手一个月PhotonVPS美国Linux VPS试试了。PhotonVPS允许合法大人内容,支持支付宝、paypal和信用卡,30天退款保证。Photo...

马赛克图片为你推荐
月付百万的女人们人100%靠外表日剧男主是谁锦天城和君合哪个好合肥和君纵达好吗?手机杀毒软件哪个好手机杀毒清理软件哪个好啊苹果手机助手哪个好iphone手机助手哪个好用?手机炒股软件哪个好手机炒股哪个软件好 要免费的播放器哪个好什么手机视频播放器比较好用?网络机顶盒哪个好机顶盒哪个好用美国国际集团世界五百强企业前五十名是哪些?美国国际东西方大学出国留学,美国“野鸡大学”有哪些?q空间登录怎样从空间登录QQ号
vps论坛 重庆服务器托管 分销主机 国外bt 好玩的桌面 web服务器是什么 摩尔庄园注册 万网注册 腾讯数据库 privatetracker 聚惠网 godaddy中文 web是什么意思 优惠服务器 WHMCS 回程 联想塔式服务器 snis-789 免费网络小说 免费网络游戏加速器 更多