R数据结构

image.png
R 语言的基础数据结构可以按照维度来划分(1 维、 2 维…n 维);也可以按照它们所包含的数据类型是否相同来划分。 R 语言没有 0 维数据结构(标量)

向量

向量是R中最基本的数据结构,有两种形式原子向量和列表 ,有三个共同属性

  • 类型 typeof()
  • 长度, length(),它包含有多少元素。
  • 属性, attributes(),额外的任意元数据

    原子向量

    有四种常见的原子向量类型

  • 逻辑型

  • 整数型
  • 双精度型
  • 字符型

使用is.atomic(x) 或 is.list(x)测试变量是否为原子向量

  1. int_c <- c(1L,2L,3L)
  2. dou_c <- c(1.2,2.2,3.3)
  3. bool_c <- c(T,T,T,F)
  4. string_c <- c("1","3","4")
  5. > is.atomic(int_c)
  6. [1] TRUE
  • NA

缺失值用 NA 来表示,这是一个长度为 1 的逻辑向量。 在 c()函数中使用时, NA总是被强制转换为正确的类型。 可以使用 NAreal(双精度浮点数向量)、 NAinteger和 NAcharacter来创建一系列确定类型的 NA

  1. > typeof(c(NA_character_)[1])
  2. [1] "character"

类型测试与强制转换

使用一下函数可以测试类型,

  • is.character()
  • is.double()
  • is.integer()
  • is.logical()
  • is.numeric()是用于测试向量是不是”数值”(“numberliness”)类型的,它对整数和双精度浮点数向量都会返回 TRUE。

向量内元素必须是同一类型,类型不同会自动强制转换, 也可自己使用

  • as.character()
  • as.double()
  • as.integer()
  • as.logical()

进行明确的强制转换

  1. > c(1,3,"4")
  2. [1] "1" "3" "4"
  3. > is.character(c(1,3,"4"))
  4. [1] TRUE
  5. > is.numeric(dou_c)
  6. [1] TRUE
  7. > is.numeric(int_c)
  8. [1] TRUE

列表

列表与原子向量是不同的,因为它们的元素可以是任何类型,也包括列表类型本身。 创建列表使用 list(),如果原子向量中存在列表,那么原子向量会强制被转换为列表

  1. x <- list(1:3, "a", c(TRUE, FALSE, TRUE), c(2.3, 5.9))
  2. a <- c(list(c(1,2)))
  3. is.list(a)
  4. [1] TRUE

使用unlist() 可将列表直接转换为原子向量,如果存在不同类型的元素,会自动执行强制转换

  1. a <- c(list(c(1,2), c("1","3")))
  2. unlist(a)
  3. [1] "1" "2" "1" "3"

属性

所有的对象都可以拥有多个属性,属性可以使用 attr()函数一个一个的访问,也可以使用 attributes()函数一次性访问

  1. b <- 1:3
  2. attr(b, "attr1") <- "attr.test"
  3. attr(b, "attr2") <- "attr.test2"
  4. attr(b, "attr1")
  5. [1] "attr.test"
  6. attributes(b)
  7. $attr1
  8. [1] "attr.test"
  9. $attr2
  10. [1] "attr.test2"
  • structure()函数返回一个带有被修改了属性的新对象

    1. structure(1:10, my_attribute = "This is a vector")
    2. [1] 1 2 3 4 5 6 7 8 9 10
    3. attr(,"my_attribute")
    4. [1] "This is a vector"

    向量的3个属性

  • 名字: 一个字符向量,用来为每一个元素赋予一个名字 names()函数修改

    1. a <- c(1,2,3)
    2. names(a) <- c("a","b","c")
    3. a b c
    4. 1 2 3
  • 维度: 用来将向量转换成矩阵和数组 ,默认NULL,dims()函数修改

    1. dim(a)
    2. NULL
  • 类:用于实现 S3 对象系统

    因子

    因子: 因子是仅包含预定义值的向量 ,因子构建于整数向量
    有两个属性:

  • levels: 定义了可以允许的取值的集合

  • 类: “factor”,使它们与普通的整数向量表现出不同的行为

    1. a <- factor(c("a","b","b","c"))
    2. a
    3. [1] a b b c
    4. Levels: a b c

    数组和矩阵

    为原子向量添加一个 dim()属性,可以让它变成多维数组。 数组的一种特例是矩阵,即二维数组。

    1. > a <- c(1:12)
    2. > dim(a) <- c(3,4)
    3. > a
    4. [,1] [,2] [,3] [,4]
    5. [1,] 1 4 7 10
    6. [2,] 2 5 8 11
    7. [3,] 3 6 9 12

    数组

    使用array()函数创建一个数组, 数组与矩阵的区别是,数组可以是大于二维的,而矩阵只能是是二维数组 ```r a <- array(1:6, c(1,2,3))

    a , , 1

    [,1] [,2] [1,] 1 2

, , 2

  1. [,1] [,2]

[1,] 3 4

, , 3 [,1] [,2] [1,] 5 6

  1. <a name="dfQEn"></a>
  2. ### 矩阵
  3. 使用matrix()创建矩阵
  4. ```r
  5. a <- matrix(1:6, nrow = 2, ncol = 3)
  6. a
  7. [,1] [,2] [,3]
  8. [1,] 1 3 5
  9. [2,] 2 4 6
  • length(): 返回矩阵中所有元素的数量
  • nrow():返回矩阵的行数
  • ncol():返回矩阵的列数
  • names() :返回矩阵的名称,行列的名字分别用,rownames()和colnames()设置
  • dims() 返回维度信息

    数据框

    数据框是由等长向量构成的列表。 它也是二维结构,所以它具有矩阵和列表双重属性。 也就是说,数据框拥有 names()、 colnames()和 rownames(),尽管 names()和 colnames()对数据框来说是一样的。 数据框的 length()是列表的长度,所以和 ncol()相同; nrow()则得到行数。

    data.frame

    使用data.frame创建数据框:

    1. df <- data.frame(
    2. x = 1:3,
    3. y = c("a", "b", "c"),
    4. # 新版本r stringsAsFactors默认FALSE
    5. stringsAsFactors = FALSE)
    6. > df
    7. x y
    8. 1 1 a
    9. 2 2 b
    10. 3 3 c

    使用is.data.frame() 检测一个对象是否为数据框,可以使用 as.data.frame()把一个对象转换成数据框:

  • 一个原子向量会创建单列数据框。

  • 列表中的每个元素会成为数据框的一列;如果元素的长度不同,则会发生错
    误。
  • n 行 m 列的矩阵会转换为 n 行 m 列数据框。

使用cbind()和rbind()连接数据框, 连接时行列数量必须对应

  1. cbind(df, data.frame(z = c(5,6,7)))
  2. x y z
  3. 1 1 a 5
  4. 2 2 b 6
  5. 3 3 c 7
  6. rbind(df, c(5,6))
  7. x y
  8. 1 1 a
  9. 2 2 b
  10. 3 3 c
  11. 4 5 6

tibble

tibble 是一种简单数据框,它对传统数据框的功能进行了一些修改,以便更易于使用

  1. library(tidyverse)
  2. df <- tibble(
  3. x = 1:3,
  4. y = c("a","b", "c")
  5. )
  6. df
  7. # A tibble: 3 x 2
  8. x y
  9. <int> <chr>
  10. 1 1 a
  11. 2 2 b
  12. 3 3 c

可以使用as_tibble将data.frame转换为tibble,其他的用法与data.frame基本一致