R语言编程
2013-07-22 16:46 Loull 阅读(665) 评论(0) 编辑 收藏 举报R中的帮助文档非常有用,其中有四种类型的帮助
- help(functionname) 对已经加载包所含的函数显示其帮助文档,用?号也是一样的。
- help.search(\'keyword\') 对已经安装的包搜索关键词,用??号功能一样。
- help(package=\'packagename\') 显示已经安装的包的描述和函数说明
- RSiteSearch(\'keyword\') 在官方网站上联网搜索
R语言的启动
- R语言启动后会首先查找有无.Rprofile文档,用户可通过编辑.Rprofile文档来自定义R启动环境,该文件可放在工作目录或安装目录中。
- 之后R会查找在工作目录有无.RData文档,若有的话将自动加载恢复之前的工作内容。
- 在R中所有的默认输入输出文件都会在工作目录中。getwd() 报告工作目录,setwd() 负责设置工作目录。在win窗口下也可以点击Change Working Directory来更改。
- Sys.getenv(\'R_HOME\') 会报告R主程序安装目录
- ?Startup可以得到更多关于R启动时的帮助
II. 对象和类
R是一种基于对象(Object)的语言,所以你在R语言中接触到的每样东西都是一个对象,一串数值向量是一个对象,一个函数是一个对象,一个图形也是一个对象。基于对象的编程(OOP)就是在定义类的基础上,创建与操作对象。
对象中包含了我们需要的数据,同时对象也具有很多属性(Attribute)。其中一种重要的属性就是它的类(Class),R语言中最为基本的类包括了数值(numeric)、逻辑(logical)、字符(character)、列表(list),在此基础上构成了一些复合型的类,包括矩阵(matrix)、数组(array)、因子(factor)、数据框(dataframe)。除了这些内置的类外还有很多其它的,用户还可以自定义新的类,但所有的类都是建立在这些基本的类之上的。
我们下面来用一个简单线性回归的例子来了解一下对象和类的处理。
# 创建两个数值向量 x <- runif(100) y <- rnorm(100)+5*x # 用线性回归创建模型,存入对象model model <- lm(y~x)
好了,现在我们手头上有一个不熟悉的对象model,那么首先来看看它里面藏着什么好东西。最有用的函数命令就是attributes(model),用来提取对象的各种属性,结果如下:
< attributes(model) $names [1] "coefficients" "residuals" "effects" [4] "rank" "fitted.values" "assign" [7] "qr" "df.residual" "xlevels" [10] "call" "terms" "model" $class [1] "lm"
可以看到这个对象的类是“lm”,这意味着什么呢?我们知道对于不同的类有不同的处理方法,那么对于modle这个对象,就有专门用来处理lm类对象的函数,例如plot.lm()。但如果你用普通的函数plot()也一样能显示其图形,Why?因为plot()这种函数会自动识别对象的类,从而选择合适的函数来对付它,这种函数就称为泛型函数(generic function)。你可以用methods(class=lm)来了解有哪些函数可适用于lm对象。
好了,我们已经知道了model的底细了,你还想知道x的信息吧。如果运行attributes(x),会发现返回了空值。这是因为x是一个向量,对于向量这种内置的基本类,attributes是没有什么好显示的。此时你可以运行mode(x),可观察到向量的类是数值型。如果运行mode(model)会有什么反应呢?它会显示lm类的基本构成是由list组成的。当然要了解对象的类,也可以直接用class(),如果要消除对象的类则可用unclass()。
从上面的结果我们还看到names这个属性,这如同你到一家餐厅问服务生要一份菜单,输入names(model)就相当于问model这个对象:Hi, 你能提供什么好东西吗?如果你熟悉回归理论的话,就可以从names里头看到它提供了丰富的回归结果,包括回归系数(coefficients)、残差 (residuals)等等,调用这些信息可以就象处理普通的数据框一样使用$符号,例如输出残差可以用model$residuals。当然用泛型函数 可以达到同样的效果,如residuals(model),但在个别情况下,这二者结果是有少许差别的。
我们已经知道了attributes的威力了,那么另外一个非常有用的函数是str(),它能以简洁的方式显示对象的数据结构及其内容,试试看,非常有用的。
V. 向量化运算
和matlab一样,R语言以向量为基本运算对象。也就是说,当输入的对象为向量时,对其中的每个元素分别进行处理,然后以向量的形式输出。R语言 中基本上所有的数据运算均能允许向量操作。不仅如此,R还包含了许多高效的向量运算函数,这也是它不同于其它软件的一个显著特征。向量化运算的好处在于避 免使用循环,使代码更为简洁、高效和易于理解。本文来对apply族函数作一个简单的归纳,以便于大家理解其中的区别所在。
所谓apply族函数包括了apply,sapply,lappy,tapply等函数,这些函数在不同的情况下能高效的完成复杂的数据处理任务,但角色定位又有所不同。
apply()函数的处理对象是矩阵或数组,它逐行或逐列的处理数据,其输出的结果将是一个向量或是矩阵。下面的例子即对一个随机矩阵求每一行的均值。要注意的是apply与其它函数不同,它并不能明显改善计算效率,因为它本身内置为循环运算。
m.data <- matrix(rnorm(100),ncol=10)
apply(m.data,1,mean)
lappy()的处理对象是向量、列表或其它对象,它将向量中的每个元素作为参数,输入到处理函数中,最后生成结果的格式为列表。在R中数据框是一种特殊的列表,所以数据框的列也将作为函数的处理对象。下面的例子即对一个数据框按列来计算中位数与标准差。
f.data <- data.frame(x=rnorm(10),y=runif(10))
lapply(f.data,FUN=function(x) list(median=median(x),sd=sd(x))
。。。