R语言是主流的数据挖掘语言之一,主要用于统计分析、绘图、数据挖掘等。R语言的源代码可自由下载使用,亦有已编译的可执行文件版本可以下载,可在多种平台下运行,包括UNIX(也包括FreeBSD和Linux)、Windows和Mac OS。R主要是以命令行操作,已有人开发了几种图形用户界面。
R是一种基于对象(Object)的语言,所以在R语言中接触到的每样东西都是一个对象,一串数值向量是一个对象,一个函数是一个对象,一个图形也是一个对象。基于对象的编程(OOP)就是在定义类的基础上创建与操作对象。
对象中包含了程序运行所需的数据,同时对象也具有很多属性(attribute)。其中一种重要的属性就是它的类(class),R语言中最为基本的类包括数值(numeric)、逻辑(logical)、字符(character)、列表(list),在此基础上构成了一些复合型的类,包括矩阵(matrix)、数组(array)、因子(factor)、数据框(dataframe)。除了这些内置的类外还有很多其他的,用户还可以自定义新的类,但所有的类都是建立在这些基本的类之上的。
和MATLAB一样,R语言以向量为基本运算对象。也就是说,当输入的对象为向量时,对其中的每个元素分别进行处理,然后以向量的形式输出。R语言中基本上所有的数据运算均允许向量操作。不仅如此,R还包含了许多高效的向量运算函数,这也是它不同于其他软件的一个显著特征。向量化运算的好处在于避免使用循环,使代码更为简洁、高效和易于理解。下面来对apply族函数作一个简单的归纳,以便大家管中窥豹,理解R语言的特点。
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)))
sapply()可能是使用最为频繁的向量化函数,它和lappy()是非常相似的,但其输出格式则是较为友好的矩阵格式。
sapply(f.data,FUN=function(x) list(median=median(x),sd=sd(x)))
class(test)
tapply()的功能则又有不同,它是专门用来处理分组数据的,其参数要比sapply多一个。我们以iris数据集为例,可观察到Species列中存放了三种花的名称,我们的目的是要计算三种花瓣萼片宽度的均值。其输出结果是数组格式。
head(iris)
attach(iris)
tapply(Sepal.Width,INDEX=Species,FUN=mean)