R数据结构

R 语言的基础数据结构可以按照维度来划分(1 维、 2 维…n 维);也可以按照它们所包含的数据类型是否相同来划分。 R 语言没有 0 维数据结构(标量)
向量
向量是R中最基本的数据结构,有两种形式原子向量和列表 ,有三个共同属性
使用is.atomic(x) 或 is.list(x)测试变量是否为原子向量
int_c <- c(1L,2L,3L)dou_c <- c(1.2,2.2,3.3)bool_c <- c(T,T,T,F)string_c <- c("1","3","4")> is.atomic(int_c)[1] TRUE
- NA
缺失值用 NA 来表示,这是一个长度为 1 的逻辑向量。 在 c()函数中使用时, NA总是被强制转换为正确的类型。 可以使用 NAreal(双精度浮点数向量)、 NAinteger和 NAcharacter来创建一系列确定类型的 NA
> typeof(c(NA_character_)[1])[1] "character"
类型测试与强制转换
使用一下函数可以测试类型,
- is.character()
- is.double()
- is.integer()
- is.logical()
- is.numeric()是用于测试向量是不是”数值”(“numberliness”)类型的,它对整数和双精度浮点数向量都会返回 TRUE。
向量内元素必须是同一类型,类型不同会自动强制转换, 也可自己使用
- as.character()
- as.double()
- as.integer()
- as.logical()
进行明确的强制转换
> c(1,3,"4")[1] "1" "3" "4"> is.character(c(1,3,"4"))[1] TRUE> is.numeric(dou_c)[1] TRUE> is.numeric(int_c)[1] TRUE
列表
列表与原子向量是不同的,因为它们的元素可以是任何类型,也包括列表类型本身。 创建列表使用 list(),如果原子向量中存在列表,那么原子向量会强制被转换为列表
x <- list(1:3, "a", c(TRUE, FALSE, TRUE), c(2.3, 5.9))a <- c(list(c(1,2)))is.list(a)[1] TRUE
使用unlist() 可将列表直接转换为原子向量,如果存在不同类型的元素,会自动执行强制转换
a <- c(list(c(1,2), c("1","3")))unlist(a)[1] "1" "2" "1" "3"
属性
所有的对象都可以拥有多个属性,属性可以使用 attr()函数一个一个的访问,也可以使用 attributes()函数一次性访问
b <- 1:3attr(b, "attr1") <- "attr.test"attr(b, "attr2") <- "attr.test2"attr(b, "attr1")[1] "attr.test"attributes(b)$attr1[1] "attr.test"$attr2[1] "attr.test2"
structure()函数返回一个带有被修改了属性的新对象
structure(1:10, my_attribute = "This is a vector")[1] 1 2 3 4 5 6 7 8 9 10attr(,"my_attribute")[1] "This is a vector"
向量的3个属性
名字: 一个字符向量,用来为每一个元素赋予一个名字 names()函数修改
a <- c(1,2,3)names(a) <- c("a","b","c")a b c1 2 3
维度: 用来将向量转换成矩阵和数组 ,默认NULL,dims()函数修改
dim(a)NULL
-
因子
因子: 因子是仅包含预定义值的向量 ,因子构建于整数向量
有两个属性: levels: 定义了可以允许的取值的集合
类: “factor”,使它们与普通的整数向量表现出不同的行为
a <- factor(c("a","b","b","c"))a[1] a b b cLevels: a b c
数组和矩阵
为原子向量添加一个 dim()属性,可以让它变成多维数组。 数组的一种特例是矩阵,即二维数组。
> a <- c(1:12)> dim(a) <- c(3,4)> a[,1] [,2] [,3] [,4][1,] 1 4 7 10[2,] 2 5 8 11[3,] 3 6 9 12
数组
使用array()函数创建一个数组, 数组与矩阵的区别是,数组可以是大于二维的,而矩阵只能是是二维数组 ```r a <- array(1:6, c(1,2,3))
a , , 1
[,1] [,2] [1,] 1 2
, , 2
[,1] [,2]
[1,] 3 4
, , 3 [,1] [,2] [1,] 5 6
<a name="dfQEn"></a>### 矩阵使用matrix()创建矩阵```ra <- matrix(1:6, nrow = 2, ncol = 3)a[,1] [,2] [,3][1,] 1 3 5[2,] 2 4 6
- length(): 返回矩阵中所有元素的数量
- nrow():返回矩阵的行数
- ncol():返回矩阵的列数
- names() :返回矩阵的名称,行列的名字分别用,rownames()和colnames()设置
-
数据框
数据框是由等长向量构成的列表。 它也是二维结构,所以它具有矩阵和列表双重属性。 也就是说,数据框拥有 names()、 colnames()和 rownames(),尽管 names()和 colnames()对数据框来说是一样的。 数据框的 length()是列表的长度,所以和 ncol()相同; nrow()则得到行数。
data.frame
使用data.frame创建数据框:
df <- data.frame(x = 1:3,y = c("a", "b", "c"),# 新版本r stringsAsFactors默认FALSEstringsAsFactors = FALSE)> dfx y1 1 a2 2 b3 3 c
使用is.data.frame() 检测一个对象是否为数据框,可以使用 as.data.frame()把一个对象转换成数据框:
一个原子向量会创建单列数据框。
- 列表中的每个元素会成为数据框的一列;如果元素的长度不同,则会发生错
误。 - n 行 m 列的矩阵会转换为 n 行 m 列数据框。
使用cbind()和rbind()连接数据框, 连接时行列数量必须对应
cbind(df, data.frame(z = c(5,6,7)))x y z1 1 a 52 2 b 63 3 c 7rbind(df, c(5,6))x y1 1 a2 2 b3 3 c4 5 6
tibble
tibble 是一种简单数据框,它对传统数据框的功能进行了一些修改,以便更易于使用
library(tidyverse)df <- tibble(x = 1:3,y = c("a","b", "c"))df# A tibble: 3 x 2x y<int> <chr>1 1 a2 2 b3 3 c
可以使用as_tibble将data.frame转换为tibble,其他的用法与data.frame基本一致
