79.关于Augmented vectors

2021-10-28  本文已影响0人  心惊梦醒

【上一篇:78.关于向量的属性-重点介绍class属性】
【下一篇:80.关于循环迭代】

    Atomic vectors和List是其他重要向量类型(例如factors,dates)的构建块,这些向量被称为Augmented vectors,因为它们是带有附加attributes,包括class的向量。因为augmened vectors有一个class,所以它们的行为表现得与构建它们的原子向量不同。我们利用四个重要的augmented vectors:FactorsDates,Date-timestibbles,前三个基于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

【上一篇:78.关于向量的属性-重点介绍class属性】
【下一篇:80.关于循环迭代】

上一篇下一篇

猜你喜欢

热点阅读