第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()函数则更加细化,查看数据的细类。