生信小白菜的第一个笔记


title: “Biotrainee Note 2 data.frame and matrix”
author: “yangyulu”
date: “2024-03-08”


#关于R语言的基本规律

代码不报错不代表真的没有错!要学会检查代码的重点

1.R语言对大小写比较敏感,命名可以数字、字母和 . 以及 _ 开头,但是如果以 . 开头,那么后面不可以接数字。
2.基本命令要么是表达式要么就是赋值。
3.命令可以被 ; 隔开,也可以直接跳到下一行。
4.基本命令可以通过大括弧{ }构成一个复合表达式。

数据类型:字符型charater、逻辑型logical、数字型numeric、复合型complex

数据结构/对象类型:向量vector、数据框data.frame、矩阵matrix、列表list

生成函数决定数据结构,而非数据的内容
常用"class" 和 "is"进行判断

  1. 向量vector:一维,只能有一种数据类型
  2. 矩阵matrix:二维,只能有一种数据类型;元素可以是数值型、字符型或者逻辑型,但是所有元素必须拥有相同的模式
    不同类型之间会兼容
  3. 数据框data.frame:二维,每列只能有一种数据
  4. 列表list:没有限制
    缺失数据NA是墙头草

数据框 数据框来源

  1. 用代码新建
  2. 由已有数据转换或处理得到
  3. 读取表格文件
  4. R语言内置数据,没有赋值但可以直接使用
用代码建data.frame
# 使用已有向量创建数据框
id<-c(letters[1:3])
name<-c("yyl","yanyulu","yuluyang")
gender<-c("girl","girl","girl")
age<-c(18,20,22)
df1<-data.frame(id,name,gender,age);df1 #自动生成4列的数据框,没有行名
# 使用向量直接创建数据框
              # 列名         # 每一列的内容
df1<-data.frame(gene=paste0("gene",1:4),#记得打",",可以不用对齐
              change=rep(c("up","down"),each=2),
               score=c(5,3,-2,-4))
df1
用代码读取data.frame
# 使用代码读取数据框 
df2<-read.csv("gene.csv") # 读取文件代码运行成功的前提:文件在工作目录下
df2
df2<-read.table("ex1.txt",header = T);df2 # 表头在表格第一行则`header=T`
class(df2)
使用row.names直接为行命名
df1<-data.frame(gene=paste0("gene",1:4),# 记得打",",可以不用对齐
              change=rep(c("up","down"),each=2),
               score=c(5,3,-2,-4),
              row.names = paste("GENE",1:4))
df1
# 以第一列为行名 `row.names=1`
查看列表维度,查看及修改行名、列名
# 问行列维度
df1<-read.csv("gene.csv");df1
dim(df1) # dim=dimension"维度",即"几行几列"
nrow(df1) # "几行"
ncol(df1) # "几列"
# 问列名
names(df1)
colnames(df1)
# 修改列名
names(df1)[1]<-"GENE";df1
colnames(df1)[1]<-"GENE";df1
# 问行名
rownames(df1)
row.names(df1)
# 修改/命名行名
rownames(df1)<-c("r1","r2","r3","r4")  # 直接添加行名
rownames(df1)<-df1$gene;df1 # 把`gene`那一列作为行名
rownames(df1)<-c(paste("GENE",1:4));df1 # 重新命名行名
# 查看所有行名、列名
dimnames(df1) #先行名,后列名
# 获取数据框结构信息
str(df1)
数据框取子集_按名字
# 按列名取子集_结果是向量
df1<-read.csv("gene.csv");df1
df1$score # 前面是数据框的名字,后面是列的名字,"$"可以自动补齐列名
mean(df1$score)
test<-read.csv("exercise.csv");test # 文件名记的带""
median(test$Petal.Length)

# 按列名取子集_结果是数据框
df1["change"] 
class(df1["change"] ) # 结果是`data.frame`

# 按行名取子集
rownames(df1)<-c(paste("GENE",1:4));df1
df1["GENE 2",] # 按名字取第二行,前提是第二行有行名
数据框取子集_按位置
# 访问前几行
df1<-read.csv("gene.csv");df1
head(df1,3)

# 访问后几行
tail(df1,2)

# 访问[第几行,第几列]
df1[2,2] # 中括号中的","表示维度的分割
df1[2,] # 取出第二行,如果第二行存在多种数据类型则不能直接生成向量,系统依旧以数据框形式展示,且自动保存行名列名
df1[,2]  # 提取第二列的所有元素,由于每一列数据类型是统一的,可以直接生成一行向量,结果与"$"相同
class(df1[,2]) # 结果是`character`
df1[2] # 访问第二列,结果保留行名、列名
class(df1[2]) # 结果是`data.frame`

# 精准取某个字段
df1[3,2] # 取第三行第二列
df1[3,"change"] # 取第三行第二列
df1[3,]$change # 取第三行第二列
df1[c(1,3),1:2] # "c(1,3)"优先运行得出"1,3",位于"[,]"左边,表示取"1,3"行;"1:2"位于"[,]"右边,表示取"1-2"列
# 数据框取子集只能取出方框型,不能是任意形状的

# 访问连续多列
df1[,2:3] # 取2-3列
df[2:3] # 返回结果同上,但不建议省略","以免引起误解

# 访问不连续的多列
df1[,c(1,3)]
df1[,c("gene","score")] 

# 访问多行
df1<-read.csv("gene.csv");df1
rownames(df1)<-c(paste("GENE",1:4));df1
df1[1:3,] # 访问连续的多行
df1[c(1,3),] # 访问不连续的多行
class(df1[1:3,]) # 返回数据框结果
df1[c("GENE 1","GENE 3"),] # 按行名访问不连续的多行
数据框内容修改
# 改单个
df1=read.csv("gene.csv")
df1[4,3]<-100 # 先取子集然后赋值
df1

# 改整列
df1$score<-c(100,2,300,4) # 先选好列再赋值
df1
数据框新增一列数据
# `$`+`新的列名`然后赋值
df1=read.csv("gene.csv")
df1$p.value=c(0.001,0.002)  # 新的列名就是增加
df1

# 命名一个df2,合并新数据和df1
df2<-cbind(df1,q.value=c(0.05,0.04,0.03,0.02));df2
数据框删除列
df1=read.csv("gene.csv");df1
subset(df1,select = -gene)  # 删除`gene`这一列
class(subset(df1,select = -gene))
df1[,-1]  # 删除第一列
class(df1[,-1])
数据框删除行
df1[-1,]
连接数据框
# 使用`merge`横向连接
# 两个存在相同的列名的数据框合
yyl1<-data.frame(ID=c("A","B","C","D","E"),
                 course=c("math","english","art","sports","music"),
                 score=c("99","77","66","88","0"))
yyl1
yyl2<-data.frame(ID=c("A","C","D"),
                Name=c("y","y","l"),
                Age=c(16,17,19))
yyl2
merge(x=yyl1,y=yyl2,by.x="ID",by.y = "ID")                

# 使用`cbind`横向连接
# 行数必须相同
cbind(yyl1[1:3,],yyl2) 

# 使用`rbind`纵向连接
# 列数必须相同,列名要一致
yyl3<-data.frame(ID=c("A","B","C","D","E"),
                 course=c("math","english","art","sports","music"),
                 score=c("99","77","66","88","0"))
yyl4<-data.frame(ID=c("G","H","I","J","K"),
                 course=c("math","english","art","sports","music"),
                 score=c("11","33","44","22","100"))
rbind(yyl3,yyl4)

# 共同列的列名不相同,可以先修改列名再合并
# 当数据与代码不匹配,优先改数据以适应代码
# 或者直接合并两个
拆分数据框
# 方法一
yyl1<-data.frame(ID=c("A","B","C","D","E"),
                 course=c("math","english","art","sports","music"),
                 score=c("99","77","66","88","0"),
                 gender=c("girl","boy","girl","boy","girl"))
yyl1_girl<-yyl1[yyl1$gender=="girl",]
yyl1_girl
yyl1_boy<-yyl1[yyl1$gender=="boy",]
yyl1_boy
yyl1_cleaver<-yyl1[yyl1$score>60,]
yyl1_cleaver
class(yyl1_boy)  # 返回结果`data.frame`

# 方法二
yyl_sub<-split(yyl1,yyl1$gender);yyl_sub # 直接撕成两个
class(yyl_sub)  # 返回结果`list`

矩阵matrix

矩阵简单理解:m行n列的excel数字表格,是一个数据的集合体

矩阵新建
# 构建3x3矩阵
m1=matrix(1:9,nrow = 3);m1  # 默认按列,从上到下、从左到右排序
class(m1)  # 识别矩阵,行默认命名`[m,]`,列默认命名`[,n]`
typeof(m1)  # `typeof`判断数据元素类型,`integer`整数
# 更改为按行排序,从左到右、从上到下
m2=matrix(1:6,nrow = 2,byrow = T);m2
# 不支持"$"
m1[2,] # 取第二行
m1[,3] # 取第三列
class(m1[2,])
class(m1[,3])
# 问维度
dim(m1)  # 3行5列
nrow(m1)  # 3行
ncol(m1)  # 5列
# 问行名列名
rownames(m1)
colnames(m1)
矩阵添加行名、列名
# `dimnames=list()`命名行列名称
m1=matrix(1:15,nrow = 3,
          dimnames = list(c("row1","row2","row3"),
                          c("col1","col2","col3","col4","col5")))
m1
# `rownames()`添加行名
m1=matrix(1:15,nrow=3)
rownames(m1)<-paste0("row",1:3)
m1
# `colnames()`添加列名
colnames(m1)<-paste0("col",1:5)
m1
矩阵取子集_按位置
# 访问具体位置
m1=matrix(1:15,nrow = 3,
          dimnames = list(c("row1","row2","row3"),
                          c("col1","col2","col3","col4","col5")))
m1[2,3]
class(m1[2,3])

# 访问第几行、第几列
m1[1,]  # 返回结果保留列名
class(m1[1,])  # 返回结果为向量结构
is.vector(m1[1,])  # true
m1[,2]  # 返回结果保留行名
class(m1[,2])  # 返回结果为向量结构

# 访问不连续的数据
m1[2:3,4:5]
class(m1[2:3,4:5])  # 返回结果为矩阵结构
m1[2:3,c(2,5)]
class(m1[2:3,c(2,5)])  # 返回结果为矩阵结构
矩阵取子集_按名称
m1=matrix(1:15,nrow = 3,
          dimnames = list(c("row1","row2","row3"),
                          c("col1","col2","col3","col4","col5")));m1
m1["row1","col3"]
m1["row1",]
m1[,"col5"]
m1[c("row1","row3"),c("col2","col5")]
修改矩阵内容
m1=matrix(1:15,nrow = 3,
          dimnames = list(c("row1","row2","row3"),
                          c("col1","col2","col3","col4","col5")));m1
# 定位-赋值
m1[2,3]<-100;m1
m1[2,]<-100;m1
m1[,3]<-100;m1
# 条件筛选-赋值
m1[m1<100]<-200;m1  # 筛选<100的元素
删减或添加矩阵行列
m1=matrix(1:15,nrow = 3,
          dimnames = list(c("row1","row2","row3"),
                          c("col1","col2","col3","col4","col5")));m1
# 删除一列
m1<-m1[,-3];m1
# 删除一行
m1<-m1[-1,];m1
# 添加一行
rbind(m1,seq(130,170,10))  # 注意:运算后没有重新赋值,`m1`仍然是原来的`m1`
# 添加一列
cbind(m1,rnorm(3))
矩阵的转置
#`t()`函数
m1=matrix(1:16,nrow=4);m1
colnames(m1)=c("f","u","c","k") # 起列名
t(m1);m1 # 转置,相当于以"1-6-11-16"为轴进行翻转
矩阵转为向量
m1=matrix(1:16,nrow=4)
as.vector(m1)  # 默认按列从上到下生成向量
as.vector(t(m1))  # 使用转置`t`函数,改为按行生成向量
矩阵转为数据框
m1=matrix(1:16,nrow=4)
colnames(m1)=c("f","u","c","k");m1
as.data.frame(m1)
class(m1)
矩阵画热图
m1=matrix(1:16,nrow=4);m1
pheatmap::pheatmap(m1)
pheatmap::pheatmap(m,cluster_cols = F,cluster_rows = F)
列表是R语言的对象集合
可以用来保存不同的数据类型
可以包含字符串、数字、向量、另一个列表,也可以包含矩阵、数据框
创建列表
# 使用`list()`函数
list1<-list(m1=matrix(1:9,nrow=3),
        m2=matrix(1:16,nrow=4));list1
list2<-list(c("coffee","bread","tattoo","dog"),
            matrix(1:21,nrow = 7));list2

列表取子集
# 访问列表第一个元素
list1[[1]]
class(list1[[1]])  # 返回结果是"matrix" "array" 
list2[[1]]
class(list2[[1]]) # 返回结果是"character"
list1$m1 #也可以用`$`取子集
# 探索列表取子集使用一个中括号和两个中括号的区别
list1[1] 
class(list1[1])  ## 返回结果是"list"
对列表进行添加、删除
# 给列表元素设置名字
list2<-list(c("coffee","bread","tattoo","dog"),
            matrix(1:21,nrow = 7));list2
names(list2)<-c("LIST1","LIST2");list2
# 添加元素
list2[3]<-list(seq(1,100,20));list2
# 删除元素
list2<-list2[-1];list2
对列表进行合并
list1<-list(m1=matrix(1:9,nrow=3),
        m2=matrix(1:16,nrow=4));list1
list2<-list(c("coffee","bread","tattoo","dog"),
            matrix(1:21,nrow = 7));list2
list3<-c(list1,list2);list3
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值