R语言的数据类型
大家都知道,从变量声明的角度区分,数据类型可以分为静态类型和动态类型。
在编译期间就确定数据类型的语言,叫静态类型语言。该类语言要求在使用任一变量之前必须先声明其数据类型。例如,Java和C就是静态类型语言。
在运行期间才确定数据类型的语言,叫动态类型语言。对于该类语言,不必事先声明其数据类型,而是通过第一次的赋值来定义其数据类型。R和Python为动态类型语言。
从不同数据类型是否可混合使用的角度来区分,语言又可以分为弱类型语言和强类型语言。
在弱类型语言中,不同数据类型间的数据可以混合使用。例如,在VBScript中,可以将字符串'12'和整数3进行连接,从而得到字符串'123'。
在强类型语言中则相反,不同数据类型间的数据不可以混合使用,必须通过类型转化函数处理后才可以。R和Python就是强类型语言。
了解了R语言的数据类型后,再来看看R语言支持的数据类型。通常它支持的数据类型有数值型、字符型、复数型和逻辑型。
数值(numeric)类型的取值是实数,在R环境中使用数字来表示。例如:
a<-9.111 mode(a) [1] "numeric"
复数(complex)类型的取值可以扩展到虚数,并使用<实部数值>+i<虚部数值>来表示。例如:
a<-100+11i mode(a) [1] "complex"
逻辑(logical)类型的取值为TRUE(也可以简写为T)和FALSE(也可以简写为F)。例如:
a<-T mode(a) [1] "logical"
字符(character)类型的取值是字符串,在R语言中,字符串需要使用英文双引号括起来表示。例如:
a<-ttt123 错误: 找不到对象'ttt123' a<-"ttt123" mode(a) [1] "character"
有两种特殊情况不能使用上述4种数据类型来描述:数据的缺失和数据的未知状态。
NA表示数据集中的某数据遗失。在对具有NA样本的变量进行函数操作时,该NA不会被直接剔除。例如,x<-c(10,20,30,NA,40),取mean(x),则结果为NA。如果函数中有na.rm参数,则可以设置为T,以去除NA的影响。虽然NA表示了数据的遗失,但在工作空间数据中(内存中)是记录该数据的,当使用向量长度读取函数length时,返回的向量长度为5。具体代码及结果如下所示:
x<-c(10,20,30,NA,40) mean(x) [1] NA mean(x,na.rm=T) [1] 25 length(x) [1] 5
NULL表示未知的状态。在对具有NULL样本的变量进行函数操作(mean是计算平均数的函数)时,NULL样本不会被计算。而使用print函数输出x数据时,也把NULL忽略了。最能说明NULL与NA不同的是当读取向量的长度时,NULL并不占据任何工作空间,length(c(10,20,30,NULL,40))的返回值为4。而NA是占据工作空间的,length(c(10,20,30,NULL,40))的返回值为5。具体代码及结果如下所示:
x<-c(10,20,30,NULL,40) mean(x) [1] 25 print(x) [1] 10 20 30 40 print(paste("x1=",x[1],";x2=",x[2],";x3=",x[3],";x4=",x[4])) [1] "x1= 10 ;x2= 20 ;x3= 30 ;x4= 40" length(x) [1] 4
有时要判断一个数据是否为NA或NULL,这时可以使用is.na和is.null函数。例如:
a<-c(1,2,3,NA,4,NULL,9) is.na(a) [1] FALSE FALSE FALSE TRUE FALSE FALSE is.null(a) [1] FALSE
在上面的代码中,is.na函数判断向量a的第四个数据(a[4],R语言中向量下标从1开始)是NA,返回值为TRUE,其余均不是NA,返回值为FALSE。is.null函数判断数据是否为NULL。注意is.na和is.null的区别,is.null在处理向量时不会分别判断内部数据,而是把向量当成一个数据统一判断,其返回值只有一个FALSE。