#R数据结构####
#向量、矩阵、数组、数据框、因子、列表
一、向量是用于存储数值型、字符型或逻辑型数据的一维数组
#向量创建
#1使用c()函数创建向量,可创建四种向量:数组,一个值,逻辑值,字符串
a<-c(1:10)
2举例:
a<-1:100 直接创建差为1的等差数组
a<-999
a<-TRUE R语言严格区分大小写
a<-'中国'
3.seq函数 生成等差序列
seq(from = 1, to = 1, by = ((to - from)/(length.out - 1)),length.out = NULL, along.with = NULL, ...)
from:首项,默认1
to:最后一项,默认1
by:步长(后一项减前一项)
length.out:指定最后向量的长度(个数)
along.with:指明该向量与另外一个向量的长度相同,along.with后应该跟一个另外向量的名字
from,to,by可以是任意实数,也可以是浮点数(小数)
4.使用rep函数 创建重复序列的向量
rep(x, time =1 , length.out =NA , each =1 )
x:重复序列的对象
times:(整体)重复的次数,默认1
length.out:默认NA(未限制)
each:每个元素重复的次数,默认1。each的优先级高于times
####
#向量的命名
向量每个元素的命名:names函数
1.a<-c(12,12,14)
myname<-c('a','b','c')
names(a)<-myname
a
结果:
a b c
12 12 14
####
#向量的引用
object[index] #object是向量,index是一个整数向量
1.使用元素的位置引用
a<-c(12,13,14,15)
直接引用向量用[]
a[1] 提取第一个元素的值
a[1:3] 提取第1到3个元素的值(冒号表示区间)
a[c(1,3)] 提取第1和第3个元素的值
a[-1] 提取除掉第一个元素的值
a[-(1:3)] 提取除掉第1到3个元素的值(冒号表示区间)
a[-c(1,3)] 提取除掉第1和第3个元素的值
2.使用逻辑向量访问
a<-c(12,13,14,15)
a[c(TRUE,FALSE,TRUE,FALSE)] 提取对应位置为TRUE的元素值
a
a<-c(12,13,14,15)
a[c(TRUE,FALSE,TRUE)] 向量个数不够元素个数,系统自动重复补全与a向量长度相同
a
3.使用元素名字访问
a<-c(12,13,14)
names(a)<-c('a','b','c')
a['a'] 此法只适用于访问一个元素的情况
a[c('a','b')]
4.使用which函数筛选
a<-c(12,13,14)
which(a==13) 返回的是位置的逻辑值。此处为2
which(a==13|a==14) |表示或,此处返回2,3
which(a<14&a>12) &表示与
a[which(a<14&a>12)]
which.max:访问最大值的位置
which.min:访问最小值的位置
which.max(a)
取出最大最小值:
a<-c(12,13,14)
l<-which.max(a)
a[l]
h<-which.min(a)
a[h]
5使用subset函数
格式:subset(向量名,逻辑值)
a<-c(12,13,14)
subset(a,c(TRUE,FALSE))
subset(a,a>12&a<14)
####
#向量的编辑
1.扩展向量 (其实就是连起来)
结果相同:
写法[1]
a<-c(1:6,7:10)
b<-c(a,100)
b
append(x, values, after = length(x))
X:向量
values:要插入的值
after:插入元素的位置(缺失该参数默认在最后插入)
写法[2]
a<-c(1:6,7:10)
append(a,100)
a<-c(1:6)
append(a,100,2) 在第二个元素之后插入100
append(a,100,0) 在第一个元素之前插入100
2.改变元素的值
a<-c(12,13,14)
a[1]<-111 向量a的第1个元素变成111
a[1:2]<-111
a[1:2]<-c(111,115) 向量a的第1个元素到2个元素的值分别被改成111,115
a[a>13]<-120
####
#向量的删除
a<-c(12,13,666,88)
a<-a[-1] 从a中删除位置为1的元素(对于数据表来说,就是第一列)
a<-a[-c(1:3)] 从a中删除位置为1到3的元素
a<-a[-(1:3)] 从a中删除位置为1到3的元素
a<-a[-c(1,3,4)] 从a中删除第1,3,4位置的元素(删除不连续位置的元素只能使用此法)
a
####
#向量的排序
R中和排序相关的函数主要有三个:sort(),rank(),order()
1.sort()—— 对向量x进行排序,返回值排序后的数值向量
sort(x, decreasing = FALSE, na.last = NA,index.return = FALSE ...)
x:排序的对象x
decreasing:默认升序
na.last:对NA值处理,若为NA,则排序时剔除掉NA值(默认情况);若为TRUE,则NA值将放在最后;若为FALSE,NA值放在最前面
index.return:返回向量位置的序号值,默认FALSE
注意:排序生成的有序向量不会改变原向量的值及顺序,需要重新赋值,如:
a<-c(12,13,NA,666,88)
sort(a)
b<-sort(a)
b
a<-c(1,12,-3,0)
-sort(-a) 将自身变成负数,按照升序默认排列(等价于自身进行降序排列)
sort(a,decreasing =TRUE ) 等价于:-sort(-a)
2.order(..., na.last = TRUE, decreasing = FALSE,
默认返回升序排序结果,返回的是向量位置值
roster[order(firstname,lastname),]
3.rank()——返回的是向量中每个数值对应的秩(即位置)
a<-c(12,13,666,88)
rank(a)
4.rev()——将向量倒序,即将原向量的元素按位置翻转
a<-c(12,13,-666,88)
rev(sort(a)) 等价于-sort(-a),这种写法更好用感觉
####
二、矩阵
创建矩阵-matrix()
R中定义:将数据按行和列组织数据,相当于二位数组,可用于描述二维的数据。
矩阵中的每个元素都有相同的数据类型,通常用列来表示不同变量的数据,用行来表示相同的数据。
matrix函数介绍
matrix(data = NA, nrow/nr = 1, ncol/nc = 1, byrow = FALSE,dimnames = NULL)
data:矩阵元素,默认NA
nrow:矩阵行,默认1
ncol:矩阵列,默认1
byrow:元素是否按行填充,默认按列填充
dimnames:以字符型向量表示行名及列名。若要指定,矩阵必须:dimnames=list(c(行名向量),c(列名向量))
1创建形式1——指定行数
a<-matrix(1:16,nrow = 4) 行或者列除不尽时进行循环补齐
a 矩阵默认按列进行排序
2创建形式2——指定列数
a<-matrix(1:16,ncol = 4)
a
3创建形式3——创建时命名各行及列
a<-matrix(1:16,
ncol = 4,
dimnames = list(c('第一行','第二行','第三行','第四行'),
c('第一列','第二列','第三列','第四列'))
)
a
4创建形式4-rbind或cbind合并矩阵生成新矩阵
a<-(1:6)
b<-(2:7)
c<-rbind(a,b) 使用rbind将两个向量或矩阵,矩阵的列数必须相等,在行的方向上合并成一个矩阵
c<-cbind(a,b) 使用cbind将两个向量或矩阵,矩阵的行数必须相等,在列的方向上合并成一个矩阵
c
4.1将两个矩阵在行方向上拼接成一个矩阵:
a<-matrix(1:16,nc=4)
a
b<-matrix(1:20,nr=5)
b
c<-rbind(a,b) 此处使用rbind时,矩阵的列数必须相等
c
4.2将两个矩阵在列方向上拼接成一个矩阵:
a<-matrix(1:20,nc=4)
a
b<-matrix(1:20,nr=5)
b
c<-cbind(a,b) 此处使用cbind时,矩阵的行数必须相等
c
访问矩阵(矩阵索引)--数据筛选
1.通过位置访问
a<-matrix(1:20,nc=4)
a[2,2] 获取某行某列:矩阵名[第几行,第几列]
a[2,] 获取某一行:矩阵名[第几行,]
a[,2] 获取某一列:矩阵名[,第几列]
a[3] 获取第几个元素:矩阵名[数字]
2.通过名称访问(前提:矩阵有命名dimnames)
a['第三行','第三列'] 与通过位置访问方式相同
a[,c('name1','name2')] 获取指定列
3.通过删除的方式访问
a<-matrix(1:20,nc=4)
a[-r,-c] 排除某一行和某一列
a[-2,-2] 与通过位置访问方式相同
4.通过向量访问
a<-matrix(1:20,nc=4)
a[向量1,向量2] 获取向量1的行集和向量2的列集交叉处的数据
a[c(2,3),c(3,4)] 获取第二行、第三行和第三列、第四列交叉处的数据
a[-c(2,3),-c(3,4)] 获取除第二行、第三行和除第三列、第四列的数据
a[c(2,3),] 获取多行
a[-c(2,3),] 排除多行
a[-c(2:4),] 排除多行
a[,c(3,4)] 获取多列
矩阵编辑
1.修改元素值
1.1修改单个值
a<-matrix(1:20,nc=4)
a[2,2]=666
a['第三行','第三列']=666
1.2修改某一行数据(修改某一列数据方式相同)
对于矩阵,其行或列给出替换的个数只能是被元素整除的数目
a<-matrix(1:20,nc=4)
a[3,]=c(12,13,14,15) 直接获取行数
a[3,]=12,13,14,15 直接获取行数
a[3,]=333 直接获取行数 ,元素不够自动循环补齐(条件是个数需被列数整除)
a['第三行',]=c(12:15) 矩阵有命名时,修改某一行数据
a
2.删除行列值 实际是访问后再次赋值
a<-matrix(1:20,nc=4)
a<-a[-3,] 删除第几行
a<-a[,-3] 删除第几列
a<-a[-2,-3] 删除第二行及第三列
3.合并矩阵
a<-matrix(1:20,nc=4)
a<-rbind(a,c(11:14)) 按行合并到矩阵a中
a<-cbind(a,c(11:13)) 按列合并到矩阵a中
a
####
三、数组
数组认为是矩阵的扩展,将矩阵扩展到2维以上
R中给定的数组是1维的相当于向量,是2维的相当于矩阵。
创建数组函数
array(data = NA, dimensions = length(data), dimnames = NULL)
data:创建数组的元素
dimensions:必选,数组的维数,是数值型向量
dimnames:可选的,各维度中名称标签列表
1.创建数组
a<-array(1:10) 相当于1维向量
a<-array(1:24,dimensions =c(4,6) ) 相当于4行6列的1维矩阵
a
2.创建2维以上的数组:
a<-array(1:60,dim =c(4,5,3) ) 创建4行5列的3维数组
a
3.创建数组时给数组的每一维的每个水平命名:
a<-c('刘能','谢广坤','大脚','香秀','大麻子')
b<-c('语文','数学','英语','化学')
c<-c('第一次','第二次','第三次')
result<-array(sample(1:100,60,replace =TRUE ),
dimensions = c(5,4,3),
dimnames = list(a,b,c))
result
2.数组的索引
a<-array(1:60,dimensions =c(3,4,3) )
a[3,4,3] 获取单个元素的值,第3行第4列第3维的元素
a['刘能','语文','第二次'] 通过名字来获取元素值
a[3,4,] 获取第3行第4列所有维度的元素的值
a[3,,,] 获取所有维度的第3行按照列的组合成一个新的数组显示
a[,3,,] 获取所有维度第3列按照列的组合成一个新的数组显示
a[1:3,c(1,3),] 获取所有维度第1行到第3行和第1列与第3列交叉的数据
####
四、数据框
data.frame(col1,col2,...)
创建数据框
student<-data.frame(ID=c(11,12,13),
Name=c("Devin","Edward","Wenli"),
Gender=c("M","M","F"),
Birthdate=c("1984-12-29","1983-5-6","1986-8-8”),
row.names = student$ID #类似于主键
)
####
五、因子factor
类别(名义型)变量和有序类别(有序型)变量在R中称为因子
#表示有序型变量,需要指定ordered=TRUE
status<-c("poor","improved","excellent"
status<-factor(status,ordered=TRUE,
levels=c("poor","improved","excellent"), #指定顺序
)
#表示数值型变量可以用levels和labels参数来编码成因子
sex<-factor(sex,levels=c(1,2),labels=c("male","female"))
#结果会把数值型变量转换成无序因子,标签"male","female"将替代1,2在结果中输出
####
#六、列表list
#列表是一些对象的有序集合,可以是任意结构的组合
mylist<-list(object1,object2,...)
mylist<-list(name1=object1,name2=object2,...) #创建列表时为列表中的对象命名
g<-'my first list'
h<-c(12,27,19,19)
j<-matrix(1:10,nrow = 5)
k<-c('one','two','three')
mylist<-list(title=g,ages=h,j,k)
mylist[["ages"]] #通过双重方括号访问列表中的元素