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:3
attr(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 10
attr(,"my_attribute")
[1] "This is a vector"
向量的3个属性
名字: 一个字符向量,用来为每一个元素赋予一个名字 names()函数修改
a <- c(1,2,3)
names(a) <- c("a","b","c")
a b c
1 2 3
维度: 用来将向量转换成矩阵和数组 ,默认NULL,dims()函数修改
dim(a)
NULL
-
因子
因子: 因子是仅包含预定义值的向量 ,因子构建于整数向量
有两个属性: levels: 定义了可以允许的取值的集合
类: “factor”,使它们与普通的整数向量表现出不同的行为
a <- factor(c("a","b","b","c"))
a
[1] a b b c
Levels: 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()创建矩阵
```r
a <- 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默认FALSE
stringsAsFactors = FALSE)
> df
x y
1 1 a
2 2 b
3 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 z
1 1 a 5
2 2 b 6
3 3 c 7
rbind(df, c(5,6))
x y
1 1 a
2 2 b
3 3 c
4 5 6
tibble
tibble 是一种简单数据框,它对传统数据框的功能进行了一些修改,以便更易于使用
library(tidyverse)
df <- tibble(
x = 1:3,
y = c("a","b", "c")
)
df
# A tibble: 3 x 2
x y
<int> <chr>
1 1 a
2 2 b
3 3 c
可以使用as_tibble将data.frame转换为tibble,其他的用法与data.frame基本一致