#2.1.1基本数据类型 |
|
class() |
#显示一个数据对象的数据类型 |
|
as.factor() |
#把其他类型数据转换成因子型 |
|
as.character() |
#把其他类型数据转换成字符型 |
|
is.character() |
#查看数据类型是否为字符型,同理is.factor() |
|
object.size() |
#观察数据大小 |
|
#(一) |
#数值型(numeric) |
a=2; class(a) |
#R会把所有超过电脑存储限制的数字当作正无穷,这个限制大约为1.8*10^38 |
#一旦算式中有正无穷或者负无穷的子项出现,结果就会是无穷或者是NaN(Not a Number)的数 |
exp(1000)#正无穷 |
-10/0#负无穷 |
exp(990)#正无穷 |
exp(1000)/exp(990)#NaN类型,原本应该是exp(10),但是由于子项都是正无穷 |
|
#(二) |
#字符型(character) |
a="2" |
class(a) |
|
b="想你" |
class(b) |
|
1+"1" |
#错误,non-numeric argument to binary operator |
|
#(三) |
#逻辑性(logical) |
#TRUE FALSE |
#在R中,TRUE对应数字1,FALSE对应数字0 |
TRUE+FALSE |
TRUE>FALSE |
|
#(四) |
#因子型数据(factor) |
(genders = factor(c("男","女","女","男","男"))) |
is.factor(genders) |
class(genders) |
|
#改变因子型数据各水平的编码顺序 |
(class=factor(c("Poor","Improved","Excellent"),ordered = T, levels =c("Poor","Improved","Excellent"))) |
|
#什么时候需要把字符型数据转换成因子型数据呢? |
#定性变量和定序变量 |
#如:在作图中需要对数据分组,用来分组的变量就应该变成因子型 |
#如:需要做包含定性变量的回归模型,定性变量就要变成因子型进入模型 |
|
#(五) |
#时间型数据(Date/POSIXct/POSIXlt) |
#以字符串形式输入R中 |
#Date日期数据,它不包括时间和时区信息 |
#POSIXct/POSIXlt类型数据,包括日期、时间和时区信息 |
|
#Date自动识别以斜杠(2020/12/22)和短横线(2022-12-22) |
#用as.Date()转换 |
#例: |
moviedate="2020/12/22" |
class(moviedate) |
##[1] "character" |
moviedate=as.Date(moviedate) |
moviedate |
##[1] "2020-12-22" |
class(moviedate) |
##[1] "Date" |
|
#日期格式示意表(《R语言:从数据思维到数据实战》 Page49) |
x<-c("1Jan1960","31mar1978") |
y<-as.Date(x) |
##Error in charToDate(x) : 字符串的格式不够标准明确 |
y<-as.Date(x,"%d%b%Y") |
y |
##[1] "1960-01-01""1978-03-31" |
|
dates <- c("02/27/92", "02/27/92") |
as.Date(dates, "%m/%d/%y") |
##[1] "1992-02-27" "1992-02-27" |
|
#POSIXct/POSIXlt是精确到秒级的时间戳 |
#as.POSIXct() |
as.POSIXct("2020-12-22 14:05:31") |
##[1] "2020-12-22 14:05:31 CST" |
as.POSIXct("December-22-2020 14:05:31") |
##Error in as.POSIXlt.character(x, tz, ...) : 字符串的格式不够标准明确 |
as.POSIXct("December-22-2020 14:05:31", format = "%B-%d-%Y %H:%M:%S") |
##[1] "2020-12-22 14:05:31 CST" |
|
#format()可以用来更改时间数据的输出格式 |
#例: |
(n=c("2016-03-14","2016-02-08")) #原始日期数据 |
m<-as.Date(n) |
class(m) |
##[1] "2016-03-14" "2016-02-08" |
|
format(m,format = "%B %d %Y") #改成月日年的格式 |
##[1] "三月 14 2016" "二月 08 2016" |
|
format(m,format = "%B %d %Y %A") #加入星期的信息 |
##[1] "三月 14 2016 星期一" "二月 08 2016 星期一" |
|
format(m,format = "%B") #只提取月份的信息 |
##[1] "三月" "二月" |
|
Sys.time() #输出系统时间 |
##[1] "2020-12-22 14:30:19 CST" |
|
class(Sys.time()) #查看时间类型 |
##[1] "POSIXct" "POSIXt" |
|
format(Sys.time(),format="%B %d %Y") #提取部分时间信息 |
##[1] "十二月 22 2020" |
|
format(Sys.time(),format = "%Y %B %a %H:%M:%S") #提取部分时间信息 |
##[1] "2020 十二月 周二 14:37:21" |
|
#lubridate是一款专门高效处理时间数据的包 |
#主要有两类函数 |
#一类处理时点数据 |
#另一类处理时段数据 |
#例: |
library(lubridate) #加载包 |
#额外备注:require()和library()都可以加载包,当加载一个不未下载的包时:require()会发出警告但继续执行程序,如果将其赋值给X<-require("xixihaha"),查看X可知返回了FALSE;而library()则会终止运行程序,并报错。因此,写R程序的常用技巧为(举例): |
#额外备注:if(!require("cluster")) install.packages("cluster") |
#额外备注:library(cluster) |
|
x= c(20090101,"2009-01-02","2009 01 03","2009-1-4","2009-1,5","Created on 2009 1 6", "200901 !!! 07") |
ymd(x) |
##[1] "2009-01-01" "2009-01-02" "2009-01-03" "2009-01-04" "2009-01-05" "2009-01-06" "2009-01-07" |
|
mday(as.Date("2020-12-22")) #Get/set days component of a date-time |
##[1] 22 |
|
wday(as.Date("2020-12-22")) #Get/set days component of a date-time |
##[1] 3 |
|
hour(as.POSIXct("2020-12-22 14:30:19")) #Get/set hours component of a date-time |
##[1] 14 |
|
minute(as.POSIXct("2020-12-22 14:30:19")) #Get/set minutes component of a date-time |
##[1] 30 |
|
#时间型数据的操作 |
#1、做差 |
begin=as.Date("2019-11-21") |
end=as.Date("2020-12-22") |
|
#方法一:直接相减 |
#求任意两个距离的天数 |
(during=end-begin) |
##Time difference of 397 days |
|
#方法二:或者用difftime()函数提取 |
#求任意两个日期距离的天数、周数和小时数 |
difftime(end,begin,units="days") |
##Time difference of 397 days |
difftime(end,begin,units="weeks") |
##Time difference of 56.71429 weeks |
difftime(end,begin,units="hours") |
##Time difference of 9528 hours |
|
#2、排序 |
#sort() #将向量重新排序 |
#order() #返回一个向量升序排序后的数字在原数据中的位置 |
#具体看Page52 |
|
|
################################# |
#总结# |
|
class() #显示一个数据对象的数据类型 |
as.factor() #把其他类型数据转换成因子型 |
as.character() #把其他类型数据转换成字符型 |
is.character() #查看数据类型是否为字符型,同理is.factor() |
object.size() #观察数据大小 |
as.Date() #Date自动识别以斜杠(2020/12/22)和短横线(2022-12-22) |
format() #用来更改时间数据的输出格式 |
as.POSIXct() #POSIXct/POSIXlt是精确到秒级的时间戳 |
Sys.time() #输出系统时间 |
require() #加载包 |
library(lubridate) #加载包 #lubridate是一款专门高效处理时间数据的包 |
ymd(x) #library(lubridate) |
mday(as.Date("2020-12-22")) #Get/set days component of a date-time |
wday(as.Date("2020-12-22")) #Get/set days component of a date-time |
hour(as.POSIXct("2020-12-22 14:30:19")) #Get/set hours component of a date-time |
minute(as.POSIXct("2020-12-22 14:30:19")) #Get/set minutes component of a date-time |
difftime() #求任意两个日期距离的天数、周数和小时数 |
|
################################ |