R基础-3

2023-03-13 13:55:54 浏览数 (1)

数据结构

3 数据框、矩阵和列表

之前学过的,Vector向量是 一维的

数据框、矩阵和列表如下:

1)现在学“表格” 二维:二维有两个:(1)matix 矩阵 —— 二维,只允许一种数据类型。(2)data.frame 数据框—— 二维,每列只允许一种数据类型(列与列之间相不相同都行)。

2)list列表:可装万物。

只看外观的话没法判断是个什么数据结构,要判断的话有两种方式:(1)根据生成它的函数;(2)用 class 或 is 族函数判断。那么为什么非要区分数据结构类型呢?因为不同的数据结构的应用场景不一样,比如有些函数的输入数据仅支持数据框,有些仅支持矩阵。

3.1 数据框来源

(1)用代码新建

(2)由已有数据转换或处理得到

(3)读取表格文件

(4)R语言内置数据

3.2 新建数据框(数据框是以列为单位组织的)

3.2.1  用代码新建

代码语言:javascript复制
data.frame  #新建数据框的一个函数,内部的代码分成了两大半。
>df1 <-data.frame(gene = paste0("gene",1:4),
                  change = rep(c("up","down"),each = 2),
                  score = c(5,3,-2,-4))

可以R中跑一次上面的代码看看,gene change score是列的名字,后面的代码是形成列的内容的代码。

3.2.2 从文件中读取

代码语言:javascript复制
>df2<- read.csv("gene.csv")

3.3 数据框属性(数据框严格区分 “行” 和 “列”)

代码语言:javascript复制
 #写上注释
> dim(df1)  #维度  
> nrow(df1)   #行
> ncol(df1)   # 列
代码语言:javascript复制
> rownames(df1)  #行名
> colnames(df1)  #列名

3.4 数据框取子集:$ 、[ ] 、按照名字、按条件(逻辑值)

代码语言:javascript复制
按照1列取  df1$
> df1$score   #删掉score,按Tab键试试。这是自动补齐。现在相当于一个向量了。
代码语言:javascript复制
#按照坐标取
> df1[2,2]    #取了第2行第2列。
> df1[2, ]    #取了第2行,输出的是一个数据框
> df1[ ,2]    #取了第2列 ,输出的是一个向量。因为这一列的数据类型必须是一样的。
> df1[c(1,3),1:2]

中括号里的逗号,表示维度的分割。

代码语言:javascript复制
#按照名字,按照这种方式可以一次提取两列。但是 $ 自动补齐不可以
>df1[,"gene"]
> df1[,c("gene","change")]
代码语言:javascript复制
#按条件(逻辑值)  挑选score>0 的行
> df1[df1$score>0,]  #这是按照行取的,整行提取,没有对列做任何事情。逻辑值符合的条件是score一列大于0被保留下来。
#思考?筛选score>0的基因?
> df1[df1$score>0,1]      #这是数据框取子集
或者
>df1$gene[df1$score>0]    #这是向量取子集 ,相当于y[x>0]

代码思维

代码语言:javascript复制
#如何取数据框的最后一列?
>df1[,ncol(df1)]
#如何取数据框除了最后一列以外的的其他列?
> df1[,-ncol(df1)]       # - 有反选的意思

3.5 数据框修改

代码语言:javascript复制
#改一个格
> df1[3,3]<-5
> df1
#改一整列
> df1$score<- c(12,23,50,2)
> df1
#加一列
>df1$p.value<- c(0.01,0.02,0.07,0.05)    #这个列的名字之前的里面没有
>df1
代码语言:javascript复制
#行名和列名的修改,也就是向量的修改
>rownames(df1)<- c("r1","r2","r3","r4")   #修改全部行名
> colnames(df1)[2] <-"CHANGE"             #改一个列名,比如修改第二列的列名,就是修改【列明这个向量】的第二个元素。

3.6 两个数据框的连接

代码语言:javascript复制
>merge(test1,test2,by="name")   #name是共同一列的列名。必须是个列名。
#思考,共同列的列名不相同,怎么连接?
> merge(test1,test3,by.x="name",by.y="NAME")    #但是要注意,一定要对应,test1是x,test3是y。

记忆卡片

数据框的来源            新建、转换、读取、内置

属性                          dim  rownames  colnames

取子集                      $取列 / [行,列]            行列名/行列号、逻辑值

修改/新增                 取子集 赋值

两表相连                  merge

矩阵新建和取子集

0 人点赞