第2章 数据对象与数据读写
2.1 数据类型
1.基本数据类型
R语言的对象包括数值型、逻辑型、字符型、整数型、日期型等。此外,也有可能是缺省值(NA)。R语言中有一系列的函数可以进行数据类型的判别及转换,见表2-1。
表2-1 数据类型的辨别及转换函数
·实例:构建一个对象,辨别其中函数的类型,以及进行类型转换。
##数据类型的判别及转换 > x<-c(1,2,3,NA) #构建一个对象 > is.na(x) #判别是否存在缺失值 [1] FALSE FALSE FALSE TRUE > x1<-c(1,2,3) #构建一个对象 > is.numeric(x1) #判别是否是数值型数据 [1] TRUE > x2<-as.character(x1) #将对象转化为字符型数据 > is.character(x2) #判别是否转化为字符型数据 [1] TRUE
2.日期变量
日期值通常以字符串的形式传入R中,然后转化为以数值形式存储的日期变量。在R中,字符型的日期值无法计算日期变量,因此可通过日期值处理函数,将字符型的日期值转换成日期变量。日期变量的常用函数见表2-2。
表2-2 日期变量常用函数
(1)as.Date()
·功能:将字符串形式的日期值转换为日期变量。
·使用格式:
as.Date(x, format = "", ...)
其中x是要转换的对象,为字符型数据,format则给出了用于读入日期的适当格式(见表2-3)。
表2-3 读入日期的格式
注意 as.Date()函数只能转换包含年月日星期的字符串,无法转换具体到时间的字符串。
·实例:将字符型日期值转换为日期变量。
## 日期变量的转换 # 创建字符串的日期值 > dates <- c("01/27/2016", "02/27/2016", "01/14/2016", "02/28/2016", "02/01/2016") # 按照月日年的格式进行转换 > (date<-as.Date(dates, "%m/%d/%Y")) [1] "2016-01-27" "2016-02-27" "2016-01-14" "2016-02-28" "2016-02-01"
(2)as.POSIXlt()
·功能:将字符串形式的日期时间值转换为指定的格式的时间变量。
·使用格式:
as.POSIXlt(x, tz = "", format)
其中x为想要转换的字符串型日期时间值;tz指定转换后的时区,""为当前时区,"GMT"为UTC时区;format指定要转换的日期值的格式。
·实例:将字符串型日期时间值转换为时间变量。
## 时间变量的转换 # 创建一个字符型日期时间变量 > x <- c("2016-02-08 10:07:52", "2016-08-07 19:33:02") # 判定是否为字符型变量 > is.character(x) [1] TRUE # 对字符串形式的日期时间值按照格式进行转换 > as.POSIXlt(x,tz="","%Y-%m-%d %H:%M:%S") [1] "2016-02-08 10:07:52 CST" "2016-08-07 19:33:02 CST"
注意 指定format格式中的年月日与时分秒之间要有空格隔开,CST为当前时区即中国标准时间。
(3)strptime()
·功能:将字符型的日期时间值转换为时间变量。
·使用格式:
strptime(x, format,tz="")
其中x是字符型数据,format指定要转换的日期值的格式,tz指定时区,""为当前时区,"GMT"为UTC时区。可以看出,strptime()函数的格式与as.POSIXlt()函数的格式略有不同。
·实例:将字符型日期时间值转换为时间变量。
## 时间变量的转换 # 沿用上例的数据 > x [1] "2016-02-08 10:07:52" "2016-08-07 19:33:02" # 按年月日 时分秒的格式转换为时间变量 > (x <- strptime(x,"%Y-%m-%d %H:%M:%S")) [1] "2016-02-08 10:07:52 CST" "2016-08-07 19:33:02 CST"
(4)strftime()
·功能:与strptime()函数相对应,strftime()函数用于将时间变量按指定的格式转换为字符型日期值。
·使用格式:
strftime(x, format = "")
其中x是时间变量,format为想要转化成的字符型日期值的输出格式。
·实例:将时间变量转化为指定格式的字符型日期值。
## 转化日期时间变量为字符串 # 使用上例的结果 > x [1] "2016-02-08 10:07:52 CST" "2016-08-07 19:33:02 CST" # 输出的格式转换成format 指定的格式 > strftime(x, format = "%Y/%m/%d") [1] "2016/02/08" "2016/08/07"
(5)format()
·功能:将对象按指定格式转化成字符串。
·使用格式:
format(x,…)
其中x为要转换为字符串的对象,…指定要转换成的字符串的格式。
注意 format()函数不仅限于将日期变量按格式转化为字符串,也可以将其他类型的变量转化为字符串。
·实例:将时间变量转化为字符串日期值。
## 使用format() 函数转换为字符串 # 使用和上例同样的数据 > x [1] "2016-02-08 10:07:52 CST" "2016-08-07 19:33:02 CST" # 输出的格式转换成format 定义的格式 > format(x,"%d/%m/%Y") [1] "08/02/2016" "07/08/2016"
3.查看对象的类型
对于未知类型的对象,在R中有3个函数可以查看对象的类型:class()、mode()、typeof()。
·使用格式:
class(x)
其中x为需要查看类型的对象,mode()、typeof()函数的使用格式与class()函数相同。
·实例:创建3个不同类型的数据,展示3个辨别函数的区别。
##查看对象类型 #创建一个数据框,内含3个不同类型的向量,设置参数避免自动转化为因子型 > df=data.frame(c1=letters[1:3], c2=1:3, c3=c(1,-1,3), stringsAsFactors=F) #使用mode()函数分别查看3个向量的数据类型 > sapply(df, mode) c1 c2 c3 "character" "numeric" "numeric" #使用class()函数分别查看3个向量的数据类型 > sapply(df, class) c1 c2 c3 "character" "integer" "numeric" #使用typeof()函数分别查看3个向量的数据类型 > sapply(df, typeof) c1 c2 c3 "character" "integer" "double"
可以发现,在展现数据的细节上,mode()<class()<typeof()。mode()函数只查看数据的大类,class()函数查看数据的类,typeof()函数则更加细化,查看数据的细类。