本篇推文是学堂君学习第3章“Vectors”的笔记,原文链接是https://adv-r.hadley.nz/vectors-chap.html,可在文末“阅读原文”处直达。 通过本章的学习,我们可以更清晰地理解R语言中各种数据结构之间的关系。
3.1 Introduction测试:如果读者能准确回答如下几个问题,就可以跳过本章的学习。
(答案见原文本章节末尾处。) 3.2 Atomic vectors常见的4个原子向量类型是:逻辑类型、整型、双精度类型和文本类型(元素为字符串),整型和双精度合称数值型。 两种不常见的类型是复数型和原始型;复数在统计学中很少使用,原始型仅在处理二进制数据时使用,本章不会进一步讨论这两种类型。 ![]()
3.2.1 Scalars标度(scalar)可以用来指示元素的类型:
3.2.2 Making longer vectors with c()
## [1] 1 2 3 4
3.2.3 Missing values
## [1] NA 10 * NA ## [1] NA !NA ## [1] NA 也有例外: NA ^ 0## [1] 1 NA | TRUE ## [1] TRUE NA & FALSE ## [1] FALSE 无法通过 x == NA ## [1] NA NA NA NA 正确方法是使用 ## [1] TRUE FALSE TRUE FALSE 在技术层面缺失值存在4种类型的: 3.2.4 Testing and coercion
但是, 原子向量的元素必须为同一类型。当合并不同类型的元素时,按文本——双精度——整型——逻辑的优先级顺序转换到同一类型。 类型转换有时会自动进行,例如大部分数学运算会将对象转为数值型。 用户可通过 3.3 Attributes因子向量、时间和日期向量、矩阵和数组是在原子向量的基础上,添加属性而形成的更复杂的向量。 3.3.1 Getting and setting
attr(x, "attr1") <- "属性1" attr(x, "attr2") <- "属性2" attr(x, "attr1") attr(x, "attr2")
c(1:3), attr1 = "属性1", attr2 = "属性2" ) attributes(x) 3.3.2 Names
x <- c(a = 1, b = 2, c = 3) # By assigning a character vector to names() x <- 1:3 names(x) <- c("a", "b", "c") # Inline, with setNames(): x <- setNames(1:3, c("a", "b", "c")) 移除 names(x) <- NULL 3.3.3 Dimensions虽然向量是一维结构的,但是由于它默认情况下没有 通常情况下,我们一般使用使用 y <- array(1:12, c(2, 3, 2)) 也可以通过给原子向量添加 dim(p) <- c(3, 2) q <- 1:12 dim(q) <- c(2, 3, 2) 3.4 S3 atomic vectors
![]() 3.4.1 Factors因子向量是在整型原子向量的基础上构建的,它有两个属性:
x ## [1] a b b a ## Levels: a b typeof(x) ## [1] "integer" attributes(x) ## $levels ## [1] "a" "b" ## ## $class ## [1] "factor" 当数据所有可能出现的值是已知的时,比较适合用因子向量来储存,且允许类别在数据中不全部出现。因子向量和文本向量的元素都可以使用 sex_factor <- factor(sex_char, levels = c("m", "f")) table(sex_char) ## sex_char ## m ## 3 table(sex_factor) ## sex_factor ## m f ## 3 0 有序(ordered)因子向量又是特殊的因子向量,它的 基础包的一些函数,如 尽管因子向量与文本向量从外观上很相似,但它实际是整型向。一些文本分析的函数也可以用在因子向量上,如 3.4.2 Dates日期向量是在双精度原子向量的基础上构建的。它有且仅有一个属性: typeof(today) ## [1] "double" attributes(today) ## $class ## [1] "Date" 日期向量元素对应的双精度值是该日期与1970年1月1日的间隔天数: date <- as.Date("1970-01-02")unclass(date) ## [1] 1 3.4.3 Date-timesbase R储存时间数据有两种方式:POSIXct和POSIXlt。POSIX是“Portable Operating System Interface”(可移植操作系统接口)的缩写。“ct”表示日历时间(calendar time),“lt”表示地方时(local time)。 POSIXct向量是在双精度型向量的基础上构建的,对应的双精度值是该时间与1970年1月1日0时0分0秒的间隔秒数。 now_ct <- as.POSIXct("1970-01-01 01:00", tz = "Etc/GMT-8")now_ct ## [1] "1970-01-01 01:00:00 +08" unclass(now_ct) ## [1] -25200
## [1] "2018-08-02 07:00:00 JST" structure(now_ct, tzone = "America/New_York") ## [1] "2018-08-01 18:00:00 EDT" structure(now_ct, tzone = "Australia/Lord_Howe") ## [1] "2018-08-02 08:30:00 +1030" structure(now_ct, tzone = "Europe/Paris") ## [1] "2018-08-02 CEST" 3.4.4 Durations时长数据也是在双精度型向量的基础上构建的,具有属性 one_week_1 ## Time difference of 1 weeks typeof(one_week_1) ## [1] "double" attributes(one_week_1) ## $class ## [1] "difftime" ## ## $units ## [1] "weeks" one_week_2 <- as.difftime(7, units = "days") one_week_2 ## Time difference of 7 days typeof(one_week_2) ## [1] "double" attributes(one_week_2) ## $class ## [1] "difftime" ## ## $units ## [1] "days" 3.5 Lists列表是比原子向量更复杂的向量:它的每个元素可以是任意类型的。但从技术上将,列表元素实际上还是同一类型——“索引”。如2.3.3节介绍,列表元素只是其他对象的索引,而被引用的对象可以是任意类型的。 3.5.1 Creating列表元素实际上只是索引,它不涉及将对象复制到列表的过程,因此很多情况下,它会比预想的要小: lobstr::obj_size(mtcars)## 7,208 B l2 <- list(mtcars, mtcars, mtcars, mtcars) lobstr::obj_size(l2) ## 7,288 B 列表元素本身还可以是列表,因此列表也被称为递归向量(recursive vector): l3 <- list(list(list(1)))str(l3) ## List of 1 ## $ :List of 1 ## ..$ :List of 1 ## .. ..$ : num 1 使用 l5 <- c(list(1, 2), c(3, 4)) str(l4) ## List of 2 ## $ :List of 2 ## ..$ : num 1 ## ..$ : num 2 ## $ : num [1:2] 3 4 str(l5) ## List of 4 ## $ : num 1 ## $ : num 2 ## $ : num 3 ## $ : num 4 3.5.3 Matrices and arrays普通的列表没有 dim(l) <- c(2, 2) l ## [,1] [,2] ## [1,] integer,3 TRUE ## [2,] "a" 1 l[[1, 1]] ## [1] 1 2 3 作者特别提到这种数据结构对时空类型的数据分析特别有用。 3.6 Data frames and tibbles数据框和tibble是在列表的基础上构建的更复杂的异质向量。 ![]() 数据框是由向量组成的列表,并且每个向量的长度是一样的。这种矩形结构,使得它兼具列表和矩阵的特点。 tibble本身也是数据框,来自 3.6.1 Creating
如果变量名称为非法名称,数据框会自动转换为合法名称,tibble允许以反引号的形式: names(data.frame(`1` = 1))## [1] "X1" library(tibble) names(tibble(`1` = 1)) ## [1] "1" 如果变量长度不一致,二者会在某种情况下循环利用较短变量的元素使之与较长向量等长:数据框要求较长向量的长度必须是较短向量的整数倍,否则报错;tibble要求较短向量的长度为1,否则报错: data.frame(x = 1:4, y = 1:2)## x y ## 1 1 1 ## 2 2 2 ## 3 3 1 ## 4 4 2 data.frame(x = 1:4, y = 1:3) ## Error in data.frame(x = 1:4, y = 1:3) : 参数值意味着不同的行数: 4, 3 tibble(x = 1:4, y = 1) ## # A tibble: 4 x 2 ## x y ## <int> <dbl> ## 1 1 1 ## 2 2 1 ## 3 3 1 ## 4 4 1 tibble(x = 1:4, y = 1:2) ## Error: Tibble columns must have compatible sizes. ## * Size 4: Existing data. ## * Size 2: Column `y`. ## Only values of size one are recycled. tibble的变量在创建时就可以引用,数据框无此功能: tibble(x = 1:3, y = x * 2 ) 3.6.2 Row names数据框可以设置行名,tibble不可以设置行名。当需要将前者转换为后者时,可以将行名作为变量: as_tibble(df, rownames = "name")3.6.4 Subsetting作者认为数据框的取子集操作时有两个麻烦的地方:
tibble对此做了改进:使用 3.6.6 List columns数据框可以使用列表作为列,这样数据框一列内的元素也可以是不同类型的了。 类型为列表的列(下文简称“列表列”)在定义时需要使用 x = 1:3, y = I(list(1:2, 1:3, 1:4)) ) ## x y ## 1 1 1, 2 ## 2 2 1, 2, 3 ## 3 3 1, 2, 3, 4 或者是在数据框创建后,再添加列表列: df <- data.frame(x = 1:3)df$y <- list(1:2, 1:3, 1:4) df ## x y ## 1 1 1, 2 ## 2 2 1, 2, 3 ## 3 3 1, 2, 3, 4 tibble可以像创建普通列一样创建列表列: tibble(x = 1:3, y = list(1:2, 1:3, 1:4) ) ## # A ibble: 3 × 2 ## x y ## <int> <list> ## 1 1 <int [2]> ## 2 2 <int [3]> ## 3 3 <int [4]> 3.6.7 Matrix and data frame columns数据框也可以使用矩阵和数据框作为列,定义方式和上文类似: dfm <- data.frame(x = 1:3 * 10, y = I(matrix(1:9, nrow = 3)) ) dfm$z <- data.frame(a = 3:1, b = letters[1:3]) str(dfm) ## 'data.frame': 3 obs. of 3 variables: ## $ x: num 10 20 30 ## $ y: 'AsIs' int [1:3, 1:3] 1 2 3 4 5 6 7 8 9 ## $ z:'data.frame': 3 obs. of 2 variables: ## ..$ a: int 3 2 1 ## ..$ b: chr "a" "b" "c" 3.7 NULL
|
万奢网手机版
官网微博:万奢网服务平台