79.关于Augmented vectors
【上一篇:78.关于向量的属性-重点介绍class属性】
【下一篇:80.关于循环迭代】
Atomic vectors和List是其他重要向量类型(例如factors,dates)的构建块,这些向量被称为Augmented vectors,因为它们是带有附加attributes,包括class的向量。因为augmened vectors有一个class,所以它们的行为表现得与构建它们的原子向量不同。我们利用四个重要的augmented vectors:Factors,Dates,Date-times和tibbles,前三个基于atomic vectors,最后一个基于List。
1)Factors基于integer vectors创建,被设计用来表示分类数据,这些数据可以包含一组固定的可能值。因子有一个levels属性。
# 创建一个因子
> (x <- factor(c("ab", "cd", "ab"), levels = c("ab", "cd", "ef")))
[1] ab cd ab
Levels: ab cd ef
# 因子的mode是integer,表示它是基于integer vectors创建的
> typeof(x)
[1] "integer"
# 因子有个levels属性和一个class属性
> attributes(x)
$levels
[1] "ab" "cd" "ef"
$class
[1] "factor"
2)R中的Dates是numeric vectors,表示从1970年1月1日以来的天数。Date-times也是numeric vectors,带有Class属性,属性值有两种:1)POSIXct - "Portable Operating System Interface", calendar time,表示从1970年1月1日以来的秒数;2)POSIXlt - list time。
# 创建一个Date对象
> x <- as.Date("1971-01-01")
# 表示Dates是基于double vectors创建的
> typeof(x)
[1] "double"
# 有个class属性,其值是"Date"
> attributes(x)
$class
[1] "Date"
> x
[1] "1971-01-01"
> unclass(x)
[1] 365
# 创建一个Date-time对象,Class属性是POSIXct
> (x <- lubridate::ymd_hm("1970-01-01 01:00"))
[1] "1970-01-01 01:00:00 UTC"
> typeof(x)
[1] "double"
> attributes(x)
$class
[1] "POSIXct" "POSIXt"
$tzone
[1] "UTC"
> unclass(x)
[1] 3600
attr(,"tzone")
[1] "UTC"
tzone属性时可选项,控制如何打印时间,而不是指绝对时间。
# 改变tzone属性的值
> attr(x, "tzone") <- "US/Pacific"
> x
[1] "1969-12-31 17:00:00 PST"
另一种类型的date-time:POSIXlt - q是基于named list构建的。POSIXlt这种类型在tydiverse中很少见,但在Base R中出现,因为需要用它们去提取date的各个组件,例如:year,month,所以这种类型还是很被需要的。关于提取date-time的各组件,lubridate包已经提供了很多方法,所以POSIXlt这种类型基本上不太被需要。POSIXct比POSIXlt更易工作,所以当遇到一个POSIXlt,通常应该将其用lubridate::as_date_time()转换成规则的date time。
# 创建一个Class属性是POSIXlt的Date-time对象
> y <- as.POSIXlt(x)
> y
[1] "1969-12-31 17:00:00 PST"
> typeof(y)
[1] "list"
> attributes(y)
$names
[1] "sec" "min" "hour" "mday" "mon" "year" "wday" "yday"
[9] "isdst" "zone" "gmtoff"
$class
[1] "POSIXlt" "POSIXt"
$tzone
[1] "US/Pacific" "PST" "PDT"
> y$hour
[1] 17
3)tibbles是augmented lists,其属性见下面的例子。传统的data frame与tibble结构相似,差异在于Class属性。
# 创建一个tibble
> (tb <- tibble::tibble(x = 1:5, y = 5:1))
# A tibble: 5 x 2
x y
<int> <int>
1 1 5
2 2 4
3 3 3
4 4 2
5 5 1
# tibble基于List创建
> typeof(tb)
[1] "list"
# tibble的属性
> attributes(tb)
$names
[1] "x" "y"
$row.names
[1] 1 2 3 4 5
$class
[1] "tbl_df" "tbl" "data.frame"
# 构建一个传统的data frame的对象
> (df <- data.frame(x = 1:5, y = 5:1))
x y
1 1 5
2 2 4
3 3 3
4 4 2
5 5 1
# 传统的data frame是基于List创建的
> typeof(df)
[1] "list"
# 传统的data frame的属性
> attributes(df)
$names
[1] "x" "y"
$class
[1] "data.frame"
$row.names
[1] 1 2 3 4 5