1. 数据结构
1.1 数据结构概述
概念
数据结构是计算机存储、组织数据的方式
数据结构是指相互之间存在一种或多种特定关系的数据元素集合
R中常见的数据结构
- 向量
- 矩阵
- 数据框:经常使用的一种数据结构
- 列表
- 因子
R中常见的数据结构
- 数值型:数值可以用于直接结算,加减乘除
- 字符串型:可以进行连接,转换,提取等
- 逻辑型:真或者假
- 日期型
1.2 向量
向量概述
向量是R语言中最基本的数据结构,向量必须由类型相同的元素组成
使用赋值符号“<-”和组合函数c(),可以创建各种类型的向量
> x<-c(1,2,3,4,5)
> x
[1] 1 2 3 4 5
> y <- c("one","two","there")
> y
[1] "one" "two" "there"
> z <- c(TRUE,FALSE,T,F)
> z
[1] TRUE FALSE TRUE FALSE
建立特殊的向量
> c(1:10)
[1] 1 2 3 4 5 6 7 8 9 10
> seq(from=1,to=10)
[1] 1 2 3 4 5 6 7 8 9 10
# from为起始值,to为终止值,by控制步幅
> seq(from=1,to=10,by=2)
[1] 1 3 5 7 9
# length.out控制个数
> seq(from=1,to=10,length.out = 3)
[1] 1.0 5.5 10.0
> seq(from=1,to=10,length.out = 3)
[1] 1.0 5.5 10.0
> rep(2,5)
[1] 2 2 2 2 2
# 一共重复5次
> rep(c(1,2,3),5)
[1] 1 2 3 1 2 3 1 2 3 1 2 3 1 2 3
# 每个重复5次
> rep(c(1,2,3),each=5)
[1] 1 1 1 1 1 2 2 2 2 2 3 3 3 3 3
# 每个重复3次,且总体重复2次
> rep(c(1,2,3),each=3,times=2)
[1] 1 1 1 2 2 2 3 3 3 1 1 1 2 2 2 3 3 3
访问向量
- 通过数字索引进行访问
> x <- c(1:10)
> x
[1] 1 2 3 4 5 6 7 8 9 10
# R语言中的索引位置从1开始
> x[1]
[1] 1
# 可以一次用向量索引多个元素
> x[c(1,3,5)]
[1] 1 3 5
# 索引负元素指显示除负元素以外的所有元素
> x[-4]
[1] 1 2 3 5 6 7 8 9 10
- 通过表达式进行访问
> x <- c(1:10)
# 输出大于4的数
> x[x>4]
[1] 5 6 7 8 9 10
# 输出大于4小于8的数
> x[x>4 & x<8]
[1] 5 6 7
# 判断1是否在x中
> 1 %in% x
[1] TRUE
# 将x中的数据定义为TRUE,并输出为TRUE的元素
> x[1 %in% x]
[1] 1 2 3 4 5 6 7 8 9 10
- 通过索引名进行访问
> x <- c(1:10)
> names(x) <- c("一","二","三","四","五","六","七","八","九","十")
> x["三"]
三
3
> x
一 二 三 四 五 六 七 八 九 十
1 2 3 4 5 6 7 8 9 10
向量运算
-
向量与数值的加减乘除
> x <- 1:10 # 对向量的运算都是对所有元素的操作 > x + 2 [1] 3 4 5 6 7 8 9 10 11 12 > x - 3 [1] -2 -1 0 1 2 3 4 5 6 7 > x <- x + 1 > x [1] 2 3 4 5 6 7 8 9 10 11 # **是幂次运算 > x ** 2 [1] 4 9 16 25 36 49 64 81 100 121 # %%是求余数 > x %% 2 [1] 0 1 0 1 0 1 0 1 0 1 # %/%是整除运算 > x %/% 2 [1] 1 1 2 2 3 3 4 4 5 5
-
向量与向量的加减乘除
> x <- 1:10 > y <- seq(1,100,length.out = 10) > x + y [1] 2 14 26 38 50 62 74 86 98 110 > x * y [1] 1 24 69 136 225 336 469 624 801 1000 > x ** y [1] 1.000000e+00 4.096000e+03 9.414318e+10 [4] 2.951479e+20 2.842171e+31 3.771117e+43 [7] 4.183778e+56 2.760699e+70 8.464150e+84 [10] 1.000000e+100 > x %% y [1] 0 2 3 4 5 6 7 8 9 10 > x %/% y [1] 1 0 0 0 0 0 0 0 0 0 #向量运算长的必须是短的元素的整数倍,可以进行循环
-
数学函数
- abs:返回每个向量的绝对值
- sqrt:计算平方根
- log、log10:计算对数
- exp:计算指数
- ceiling:返回不小于向量的最小整数
- floor:返回不大于向量的最大整数
- trunc:返回整数部分
- round:进行四舍五入
-
统计函数
- sum:向量所有元素之和
- max:向量元素最大值
- min:向量元素最小值
- range:向量元素最大和最小值
- mean:向量均值
- var:向量方差
- sd:向量标准差
- prod:向量连乘积
- median:向量中位数
- quantile:向量分位数
- which.min:最大值的索引值,还可以与其它统计函数结合
1.3 矩阵
矩阵的创建
矩阵的创建使用函数matrix(),元素数要超过行数与列数的乘积,可以只指定行数或列数
默认情况下按照列排序,可使用关键字byrow改为按行排序
> x <- matrix(1:20,nrow = 4,ncol = 5,byrow = T)
> x
[,1] [,2] [,3] [,4] [,5]
[1,] 1 2 3 4 5
[2,] 6 7 8 9 10
[3,] 11 12 13 14 15
[4,] 16 17 18 19 20
给矩阵的行与列命名
可以通过dimnames()函数给矩阵的行或列命名,命名后可以根据名字进行索引
还可以通过dim()函数创建矩阵
# 方式一:dimnames()
> x <- matrix(1:20,nrow = 4,ncol = 5,byrow = T)
> rnames <- c("R1","R2","R3","R4")
> cnames <- c("C1","C2","C3","C4","C5")
> dimnames(x) <- list(rnames,cnames)
> x
C1 C2 C3 C4 C5
R1 1 5 9 13 17
R2 2 6 10 14 18
R3 3 7 11 15 19
R4 4 8 12 16 20
# 方式二:dim()
> dim(x) <- c(4,5)
> x
[,1] [,2] [,3] [,4] [,5]
[1,] 1 5 9 13 17
[2,] 2 6 10 14 18
[3,] 3 7 11 15 19
[4,] 4 8 12 16 20
1.4 数组
数组的创建
创建数组有两种方式:一是通过函数dim()创建
二是通过array()函数创建,同时可以指定索引名
# 方式一:dim()
> x <- 1:8
> dim(x) <- c(2,2,2)
> x
, , 1
[,1] [,2]
[1,] 1 3
[2,] 2 4
, , 2
[,1] [,2]
[1,] 5 7
[2,] 6 8
# 方式二:array()
> dim1 <- c("A1","A2")
> dim2 <- c("B1","B2")
> dim3 <- c("C1","C2")
> z <- array(1:8,c(2,2,2),dimnames = list(dim1,dim2,dim3))
> z
, , C1
B1 B2
A1 1 3
A2 2 4
, , C2
B1 B2
A1 5 7
A2 6 8
1.5 列表
列表顾名思义就是用来存储很多内容的一个集合,在其他编程语言中,列表一般和数组是等同的,但是在R语言中,列表却是R中最复杂的一种数据结构,也是非常重要的一种数据结构。
列表就是一些对象的有序集合。列表中可以存储若干向量、矩阵、数据框,甚至其他列表的组合。
列表的创建
创建一个列表使用函数list(),将列表元素添加其中,并且可以为列表元素命名
> a <- 1:10
> b <- "hello world"
> c <- matrix(1:12,nrow = 3,ncol = 4)
> mlist <- list(a,b,c)
> mlist
[[1]]
[1] 1 2 3 4 5 6 7 8 9 10
[[2]]
[1] "hello world"
[[3]]
[,1] [,2] [,3] [,4]
[1,] 1 4 7 10
[2,] 2 5 8 11
[3,] 3 6 9 12
> mlist <- list(first=a,second=b,third=c)
> mlist
$first
[1] 1 2 3 4 5 6 7 8 9 10
$second
[1] "hello world"
$third
[,1] [,2] [,3] [,4]
[1,] 1 4 7 10
[2,] 2 5 8 11
[3,] 3 6 9 12
列表的索引
# 通过数值进行索引
> mlist[1]
$first
[1] 1 2 3 4 5 6 7 8 9 10
# 可以一次索引多个向量
> mlist[c(1,2)]
$first
[1] 1 2 3 4 5 6 7 8 9 10
$second
[1] "hello world"
# 可以通过名称进行索引
> mlist["first"]
$first
[1] 1 2 3 4 5 6 7 8 9 10
# 使用两个中括号进行索引时,代表是被索引元素的数据类型,而不是列表类型
> mlist[[1]]
[1] 1 2 3 4 5 6 7 8 9 10
1.6 数据框
数据框是R语言中应用最广泛的数据结构
利用数据框,可以容纳不同类型的数据,而不必使用同一类型的数据
数据框的每一列的数据类型必须相同,但不同的列可以存储不同的类型的数据
数据框的创建
> a <- c("北京","上海","广州")
> b <- c("100平","125平","126平")
> c <- c("100万","150万","200万")
# 使用data.frame将已经建立好的向量作为参数传入其中
> d <- data.frame(a,b,c)
> d
a b c
1 北京 100平 100万
2 上海 125平 150万
3 广州 126平 200万
数据框的访问
> d[1]
a
1 北京
2 上海
3 广州
> d[c(1,3)]
a c
1 北京 100万
2 上海 150万
3 广州 200万
1.6 因子
因子是R语言中非常重要的的对象,或者说向量对象
因子主要用于管理离散的分类变量,比如成绩评定等级(A、B、C),颜色的分类(红、黄、蓝)
因子对象就是管理这些类别变量的重要工具
因子的创建
> grade <- c("A","B","B","A","C")
> gradef <- factor(grade)
# levels是因子的一个重要属性,揭示了因子中的类别
> gradef
[1] A B B A C
Levels: A B C