数据结构
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