R的数据结构

#R数据结构####
#向量、矩阵、数组、数据框、因子、列表

一、向量

向量是用于存储数值型、字符型或逻辑型数据的一维数组

向量基本特点

a、向量中的元素下标是从1开始的。

b、向量构成的基本元素为:数值(numeric)、字符(character)、逻辑值(logical)、复数型 (complex);

c、向量中有一个字符,则该向量类型会变成字符。

      如果逻辑变量与数值在一起,则为转换成数值,TRUE 转变成1 and FALSE。

d、在 R 语言中没有单一的整数、单一字符的概念

     例如:X<-2;X<-'a';R 都是当作向量来处理,只是这个向量只包括单一值。

向量创建

 1使用c()函数创建向量,可创建四种向量:数组,一个值,逻辑值,字符串
a<-c(1:10)
a<-c();#生成一个空向量


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

如:rep(1,10) #重复1 10次

向量的命名

向量每个元素的命名:names函数
1.x<-c(12,12,14)
myname<-c('a','b','c')
names(x)<-myname

结果:
a b c
12 12 14

向量的引用-取子向量

object[index] #object是向量,index是一个整数向量

1.使用元素的位置(下标)引用
a<-c(12,13,14,15)

直接引用向量用[]
a[1] 提取第一个元素的值;如果 X 包括名称,注意:x[2]与 x[[2]]的区别 
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(a)
[1]   88 -666   13   12

rev(sort(a)) 等价于-sort(-a),这种写法更好用感觉

> sort(-a)
[1] -88 -13 -12 666
> -sort(-a)
[1]   88   13   12 -666
> rev(sort(a))
[1]   88   13   12 -666
> rev(sort(-a))
[1] 666 -12 -13 -88
 

向量化运算

1、如果有一个是向量,是则结果都是向量形式;

2、进行向量运算;程序会判断向量是否长度相等,如果长度不相等,则把短向量长度从头开始循环补充值,到与长向量的长度相等(注意长向量长度必须是短向量长度的整数倍)

二、矩阵

创建矩阵-matrix()

R中定义:将数据按行和列组织数据,相当于二维数组,可用于描述二维的数据。
矩阵中的每个元素都有相同的数据类型,通常用列来表示不同变量的数据,用行来表示相同的数据。
matrix函数介绍
matrix(data = NA, nrow/nr = 1, ncol/nc = 1, byrow = FALSE,dimnames = NULL)
data:向量元素元素,默认NA
nrow:行数,默认1
ncol:列数,默认1
byrow:元素是否按行填充,默认按列填充
dimnames:以字符型向量表示行名及列名。默认NULL,若要指定,矩阵必须: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] #获取第几个元素:矩阵名[数字]

a[a[,2]>3,] #取某列大于某个值。取第二列>3

2.通过名称访问(前提:矩阵有命名dimnames)
a['第三行','第三列'] 与通过位置访问方式相同
a[,c('name1','name2')] 获取指定列

3.通过删除的方式访问
a<-matrix(1:20,nc=4)
a[-r,-c] 排除某一行和某一列
a[-2,-2] 与通过位置访问方式相同

4.通过向量c()访问
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 #修改的2行第2列元素为666
a['第三行','第三列']=666

  1.2修改某一行数据(修改某一列数据方式相同)
a<-matrix(1:20,nc=4)
a[3,]=c(12,13,14,15) #将第3行元素依次修改
a[3,]=12,13,14,15     #同上
a[3,]=333 #将第3行元素修改 为333,元素不够自动循环补齐(条件是行替换元素个数必需被列数整除;同理,列替换元素个数必需被行数整除;)
a['第三行',]=c(12:15) 矩阵有命名时,修改某一行数据
a

  1.3增加行与列

a<- matrix(,4,2)

a[c(1,3),] <- matrix(c(1,2,3,4)) #将第1行和第3行的元素依次替换为1-4

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

4.矩阵转置

t(a)

查看矩阵行/列信息

colnames(Demo_1) #查看矩阵列名

rownames(Demo_1) #查看矩阵行名

rownames(Demo_1)<-c('r1','r2','r3','r4','r5') #给矩阵的行命名

dim(Demo_1) #矩阵的维度

nrow()#返回行数

ncol()#返回列数

 #返回与矩阵相同的列与行

  row()/col()函数将返回一个与某矩阵有相同维数的矩阵 ?

 

三、数据框

数据框:不同类型的列向量的组合;数据库中的二维表

创建数据框

语法:data.frame(col1,col2,stringsAsFactors =F,...)
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 #类似于主键
)

数据框基本操作

  #获取单个元素

df[i,j] #获取第 i 行第 j 列的元素

  #获取单列/行

df$sex #获取性别列

df[,3]  #获取第3列

df[1,]  #获取第1行

  #获取多列

df[1,]  #获取第1行所有列

  #获取多行 

df[c(1,2),] #取数据框的第1与第2行

 

class(df) #查看类型

class(df$sex) #查看某列的类型

length(df) #查看数据框长度

names(df) #数据框各项名称

summary(df) #summary对字符类/因子类数据,给出相应的频数统计;对数值型数据给出 5 个主要的指标(最值+四分位数)。

unique(df) #对数据框进行去重

df[duplicated(df),] #取数据框中重复的行

complete.cases(df)#判断数据框各行是否完整

df[complete.cases(df)] #选择非缺失值的数据

数据框编辑

1.合并行

Demo_3<-rbind(Demo_1[,c(1,2)], Demo_2[,c(1,2)]) #合并某两个数据框的二列

2.合并列

Demo_1$score2<-c(12,13,23) #新增列并命名

Demo_1<-cbind(Demo_1,score2=c(12,13,23))

 

四、列表(List)

 

#列表是一些对象的有序集合,可以是任意结构的组合,列表的各列可以是不同的数据类型

mylist<-list(object1,object2,...) #object1表示第1列,object2表示第2列
mylist<-list(name1=object1,name2=object2,...) #创建列表时为列表中的对象命名

#注意列表与数据框区别

    列表对每个列显示都会单独以一行的形式存在; 列表的各列长度可以不一致;

    数据框则是以表(或者是矩阵)的形式显示;所以根据数据输出的格式可以判断是列表还是数据框;

> list(name=c('a','b'),sex='b')
$name
[1] "a" "b"

$sex
[1] "b"
 
> data.frame(name=c('a','b'),sex='b')
  name sex
1    a   b
2    b   b 
#这里进行了自动补齐

 

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)

列表基本操作

1、查看列表信息

class(Demo_1) #查看数据对象类型

class(Demo_1$sex) #查看某列的类型

length(Demo_1) #查看列表长度 (列数);

names(Demo_1) #列表各项名称

 

2、取列表中的某列或者某列元素

> a=list(name=c('a','b'),sex='b')
> a[2]
$sex
[1] "b"
> a[[2]]
[1] "b"
> a=list(name=c('a','b'),sex='b')
> a[[1]][1]
[1] "a"

a[2] #取列表的第二列

a$sex #取列表的指定列

a[["sex"]] #双重方括号表示访问列表中某列的元素

a[[2]]      #取列表的第二列的元素

注意:a[[2]]与 a[2]二者输出的区别在于,前者是输出向量,后者输出是列表

a[[M]][N] #取列表中的第M列的第N 个元素

complete.cases(a)#判断列表各行是否完整

a[complete.cases(a)] #选择非缺失值的数据

 

3、增加列

a$high<-c('d','e') #给a列表新增high列

4、删除值

Demo_1$name<-NULL #删除某列

a[[1]]<-NULL                     #将列表的第1列的元素删除

 

5、列表转换

unlist(a) #把列表a转为向量

 

五、因子(Factor)

类别(名义型)变量和有序类别(有序型)变量在R中称为因子

#字符型向量因子默认水平按照字母顺序创建,因子水平就是该列值去重个数
#a 对字符型向量编码因子-将变量转换为有序因子

   #表示有序型变量,需要指定ordered=TRUE

status<-c('poor','improved','excellent','poor')
status<-factor(status,ordered = T,
levels = c('poor','improved','excellent') #指定顺序

)
#b 对数值型向量编码因子-将变量转换为无序因子

  #表示数值型变量可以用levels和labels参数来编码成因子
sex<-factor(sex,levels = c(1,2),

                   labels = c('male','female') #因子水平
)

#结果会把数值型变量转换成无序因子,标签"male","female"将替代1,2在结果中输出

 

六、数组

数组认为是矩阵的扩展,将矩阵扩展到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

数组的索引

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列交叉的数据


 

 

posted @   灯新  阅读(167)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· DeepSeek “源神”启动!「GitHub 热点速览」
· 我与微信审核的“相爱相杀”看个人小程序副业
· 微软正式发布.NET 10 Preview 1:开启下一代开发框架新篇章
· 如何使用 Uni-app 实现视频聊天(源码,支持安卓、iOS)
· C# 集成 DeepSeek 模型实现 AI 私有化(本地部署与 API 调用教程)
点击右上角即可分享
微信分享提示