前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >从零开始的异世界生信学习 R语言部分 02 数据结构之数据框、矩阵、列表

从零开始的异世界生信学习 R语言部分 02 数据结构之数据框、矩阵、列表

原创
作者头像
用户10361520
发布2023-03-03 19:30:17
1.8K0
发布2023-03-03 19:30:17
举报

数据框

data.frame 数据框

约等于表格:1.数据框不是一个具体文件,只是R语言内部的一个数据;2.数据框每一列只能有一种数据类型

数据框来源
数据框来源

新建和读取数据框

代码语言:javascript
复制
#新建和读取数据框
df1 <- data.frame(gene   = paste0("gene",1:4),
                 change  = rep(c("up","down"),each = 2),
                 score   = c(5,3,-2,-4))
df1

df2 <- read.csv("gene.csv")  #读取文件的时候注意文件路径,默认只会从工作目录中读取文件,否则可能出现报错
df2
新建数据框
新建数据框

数据框属性

代码语言:javascript
复制
数据框属性
# 
dim(df1) #
nrow(df1) #输出行数
ncol(df1) #输出列数
#
rownames(df1) #输出行名
colnames(df1) #输出列名

数据框取子集

数据主要操作为按列取子集,取出来的为向量;按行去子集取出的仍为数据框。

代码语言:javascript
复制
#4.数据框取子集
df1$gene  #删掉score,按tab键试试
mean(df1$score)

## 按坐标
df1[2,2] # 取第二行第二列
df1[2,] #取第二行
df1[,2] #取第二列
df1[c(1,3),1:2] # 取第一行和第三行以及第一列和第二列,注意逗号前后不同的向量,分别表示取得行和列!!!
## 中括号中的逗号表示维度的分隔

## 按名字
df1[,"gene"]
df1[,c('gene','change')]

## 按条件(逻辑值)
df1[df1$score>0,]

## 代码思维
#如何取数据框的最后一列?
df1[,3]
df1[,ncol(df1)]  #ncol()函数统计列数,一共多少列,就是取最后一列

#如何取数据框除了最后一列以外的其他列?
df1[,-ncol(df1)]

#筛选score > 0的基因
df1[df1$score > 0,1]
df1$gene[df1$score > 0]
数据框df1
数据框df1

数据框的修改

代码语言:javascript
复制
#5.数据框修改

#改一个格
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

#改行名和列名
rownames(df1) <- c("r1","r2","r3","r4")
#只修改某一行/列的名
colnames(df1)[2] <- "CHANGE"

# | 或符号前后不可以连接字符,只能用于数字,逻辑值

两个数据框的连接

代码语言:javascript
复制
test1 <- data.frame(name = c('jimmy','nicker','Damon','Sophie'), 
                    blood_type = c("A","B","O","AB"))
test1
test2 <- data.frame(name = c('Damon','jimmy','nicker','tony'),
                    group = c("group1","group1","group2","group2"),
                    vision = c(4.2,4.3,4.9,4.5))
test2

test3 <- data.frame(NAME = c('Damon','jimmy','nicker','tony'),
                    weight = c(140,145,110,138))
test3
merge(test1,test2,by="name")
merge(test1,test3,by.x = "name",by.y = "NAME")  #列名不相同的时候,对数据框进行组合。其中x,y分别对应着test1以及test3

#merge函数可以进行两个数据框的左右连接
merge(test1,test3,by.x='name',by.y = 'NAME', all.x = TRUE,sort = T)  #左连接,即新合并的数据框中,保留test1中保留选中的name列中的所有元素,新的数据框中没有的数据显示NA,sort表示按列排序
merge(test1,test3,by.x='name',by.y = 'NAME', all.y = TRUE,sort = T)#右连接,即新合并的数据框中,保留test3中保留选中的name列中的所有元素,新的数据框中没有的数据显示NA,sort表示按列排序
merge(test1,test3,by.x='name',by.y = 'NAME', all = T)  #取两个表的合集

#调整数据框中列的顺序,可以用重新取子集的方式
a <- test[1:3,]
a
a[,c(1,3,2)]

矩阵的新建和取子集

代码语言:javascript
复制
#矩阵的新建和取子集
m <- matrix(1:9, nrow = 3)
colnames(m) <- c("a","b","c") #加列名
m  
m[2,]  #矩阵取子集不支持使用$
m[,1]
m[2,3]
m[2:3,1:2]
m
#矩阵中的重要函数
t(m) #行列的转置,行变列,列变行,行名和列名都跟着变换
as.data.frame(m)  #将转换为数据框
#作图
pheatmap::pheatmap(m) #使用pheatmap包中的pheatmap函数做图,热图会先进行聚类,之后再作图。
pheatmap::pheatmap(m,cluster_rows = F,cluster_cols = F) #调节函数中的参数,画出的热图不聚类
聚类热图
聚类热图
非聚类热图
非聚类热图

列表新建和取子集

代码语言:javascript
复制
l <- list(m1 = matrix(1:9, nrow = 3),
          m2 = matrix(2:9, nrow = 2))
l

l[[2]]  #列表取子集
l$m1 #列表中的元素有名字,可以用$取子集

元素的名字 -names()

代码语言:javascript
复制
scores = c(100,59,73,95,45)
names(scores) = c("jimmy","nicker","Damon","Sophie","tony")
scores  #names函数可以给向量赋值名字

scores["jimmy"]  #有名字的向量可以用名字取子集
scores[c("jimmy","nicker")]

names(scores)[scores>60]

删除变量

代码语言:javascript
复制
rm(l)  #删除一个变量
rm(df1,df2) #删除多个变量
rm(list = ls())  #删除全部变量

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 数据框
    • 新建和读取数据框
      • 数据框属性
        • 数据框取子集
          • 数据框的修改
            • 两个数据框的连接
            • 矩阵的新建和取子集
            • 列表新建和取子集
            • 元素的名字 -names()
            • 删除变量
            领券
            问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档