title: "2-R语言数据结构"
output: html_document
date: "2023-02-02"
矩阵:只允许一种数据类型的二维结构
数据框:每一列只允许一种数据类型
列表:可以装各种数据类型
代码语言:text复制#重点:数据框
#1.数据框来源
# (1)用代码新建
# (2)由已有数据转换或处理得到
# (3)读取表格文件
# (4)R语言内置数据
#2.新建和读取数据框
df1 <- data.frame(gene = paste0("gene",1:4),
change = rep(c("up","down"),each = 2),
score = c(5,3,-2,-4)) #每一列之间要用,隔开
df1代码语言:txt复制## gene change score
## 1 gene1 up 5
## 2 gene2 up 3
## 3 gene3 down -2
## 4 gene4 down -4代码语言:text复制df2 <- read.csv("gene.csv") #工作目录下
df2代码语言:txt复制## gene change score
## 1 gene1 up 5
## 2 gene2 up 3
## 3 gene3 down -2
## 4 gene4 down -4代码语言:text复制#3.数据框属性
#
dim(df1)代码语言:txt复制## [1] 4 3代码语言:text复制nrow(df1) #行数代码语言:txt复制## [1] 4代码语言:text复制ncol(df1) #列数代码语言:txt复制## [1] 3代码语言:text复制#
rownames(df1) #行名代码语言:txt复制## [1] "1" "2" "3" "4"代码语言:text复制colnames(df1) #列名代码语言:txt复制## [1] "gene" "change" "score"代码语言:text复制#4.数据框取子集
df1$score #删掉score,按tab键试试,$后可用tab切换代码语言:txt复制## [1] 5 3 -2 -4代码语言:text复制df1$gene #取列代码语言:txt复制## [1] "gene1" "gene2" "gene3" "gene4"代码语言:text复制mean(df1$score)代码语言:txt复制## [1] 0.5代码语言:text复制## 按坐标
df1[2,2] #坐行右列代码语言:txt复制## [1] "up"代码语言:text复制df1[2,]代码语言:txt复制## gene change score
## 2 gene2 up 3代码语言:text复制df1[,2]代码语言:txt复制## [1] "up" "up" "down" "down"代码语言:text复制class(df1[2,]) #"data.frame"代码语言:txt复制## [1] "data.frame"代码语言:text复制class(df1[,2]) #"character"代码语言:txt复制## [1] "character"代码语言:text复制df1[c(1,3),1:2] #取第1、3行,取1、2列代码语言:txt复制## gene change
## 1 gene1 up
## 3 gene3 down代码语言:text复制## 按名字
df1[,"gene"]代码语言:txt复制## [1] "gene1" "gene2" "gene3" "gene4"代码语言:text复制df1[,c('gene','change')] #可以同时提多列(把要提出来的列写成向量),$只能提一列代码语言:txt复制## gene change
## 1 gene1 up
## 2 gene2 up
## 3 gene3 down
## 4 gene4 down代码语言:text复制## 按条件(逻辑值)
df1[df1$score>0,] #留TRUE代码语言:txt复制## gene change score
## 1 gene1 up 5
## 2 gene2 up 3代码语言:text复制#思考题,筛选score>0的基因
df1[df1$score > 0, 'gene'] #df1[df1$score > 0, 1]代码语言:txt复制## [1] "gene1" "gene2"代码语言:text复制df1$gene[df1$score > 0]代码语言:txt复制## [1] "gene1" "gene2"代码语言:text复制## 代码思维
#如何取数据框的最后一列?
df1[,3]代码语言:txt复制## [1] 5 3 -2 -4代码语言:text复制df1[,ncol(df1)]代码语言:txt复制## [1] 5 3 -2 -4代码语言:text复制#如何取数据框除了最后一列以外的其他列?
df1[,-ncol(df1)]代码语言:txt复制## gene change
## 1 gene1 up
## 2 gene2 up
## 3 gene3 down
## 4 gene4 down代码语言:text复制#筛选score > 0的基因
df1[df1$score > 0,1]代码语言:txt复制## [1] "gene1" "gene2"代码语言:text复制df1$gene[df1$score > 0]代码语言:txt复制## [1] "gene1" "gene2"代码语言:text复制#5.数据框修改
#改一个格
df1[3,3] <- 5
df1代码语言:txt复制## gene change score
## 1 gene1 up 5
## 2 gene2 up 3
## 3 gene3 down 5
## 4 gene4 down -4代码语言:text复制#改一整列
df1$score <- c(12,23,50,2) #存在的列名<- == 修改
df1代码语言:txt复制## gene change score
## 1 gene1 up 12
## 2 gene2 up 23
## 3 gene3 down 50
## 4 gene4 down 2代码语言:text复制#?
df1$p.value <- c(0.01,0.02,0.07,0.05) #不存在的列名<- == 新增
df1代码语言:txt复制## gene change score p.value
## 1 gene1 up 12 0.01
## 2 gene2 up 23 0.02
## 3 gene3 down 50 0.07
## 4 gene4 down 2 0.05代码语言:text复制#改行名和列名
rownames(df1) <- c("r1","r2","r3","r4") #行列取子集结果为向量,所以修改时也得是向量
#只修改某一行/列的名
colnames(df1)[2] <- "CHANGE"
#6.两个数据框的连接
test1 <- data.frame(name = c('jimmy','nicker','Damon','Sophie'),
blood_type = c("A","B","O","AB"))
test1代码语言:txt复制## name blood_type
## 1 jimmy A
## 2 nicker B
## 3 Damon O
## 4 Sophie AB代码语言:text复制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代码语言:txt复制## name group vision
## 1 Damon group1 4.2
## 2 jimmy group1 4.3
## 3 nicker group2 4.9
## 4 tony group2 4.5代码语言:text复制test3 <- data.frame(NAME = c('Damon','jimmy','nicker','tony'),
weight = c(140,145,110,138))
test3代码语言:txt复制## NAME weight
## 1 Damon 140
## 2 jimmy 145
## 3 nicker 110
## 4 tony 138代码语言:text复制merge(test1,test2,by="name") #by='共同一列的名字'代码语言:txt复制## name blood_type group vision
## 1 Damon O group1 4.2
## 2 jimmy A group1 4.3
## 3 nicker B group2 4.9代码语言:text复制merge(test1,test3,by.x = "name",by.y = "NAME") 代码语言:txt复制## name blood_type weight
## 1 Damon O 140
## 2 jimmy A 145
## 3 nicker B 110代码语言:text复制?merge
##### 矩阵和列表
m <- matrix(1:9, nrow = 3)
colnames(m) <- c("a","b","c") #加列名
m代码语言:txt复制## a b c
## [1,] 1 4 7
## [2,] 2 5 8
## [3,] 3 6 9代码语言:text复制#矩阵取子集,不支持$
m[2,]代码语言:txt复制## a b c
## 2 5 8代码语言:text复制m[,1]代码语言:txt复制## [1] 1 2 3代码语言:text复制m[2,3]代码语言:txt复制## c
## 8代码语言:text复制m[2:3,1:2]代码语言:txt复制## a b
## [1,] 2 5
## [2,] 3 6代码语言:text复制m代码语言:txt复制## a b c
## [1,] 1 4 7
## [2,] 2 5 8
## [3,] 3 6 9代码语言:text复制t(m) #转置代码语言:txt复制## [,1] [,2] [,3]
## a 1 2 3
## b 4 5 6
## c 7 8 9代码语言:text复制as.data.frame(m) #转换成数据框代码语言:txt复制## a b c
## 1 1 4 7
## 2 2 5 8
## 3 3 6 9代码语言:text复制pheatmap::pheatmap(m)
pheatmap::pheatmap(m,cluster_cols = F,cluster_rows = F) #可以在允许范围内修改代码代码语言:text复制#列表
l <- list(m1 = matrix(1:9, nrow = 3),
m2 = matrix(2:9, nrow = 2))
l # m1,m2是l列表里的元素名代码语言:txt复制## $m1
## [,1] [,2] [,3]
## [1,] 1 4 7
## [2,] 2 5 8
## [3,] 3 6 9
##
## $m2
## [,1] [,2] [,3] [,4]
## [1,] 2 4 6 8
## [2,] 3 5 7 9代码语言:text复制l[[2]] #两个中括号代码语言:txt复制## [,1] [,2] [,3] [,4]
## [1,] 2 4 6 8
## [2,] 3 5 7 9代码语言:text复制l$m1 #名字取子集代码语言:txt复制## [,1] [,2] [,3]
## [1,] 1 4 7
## [2,] 2 5 8
## [3,] 3 6 9代码语言:text复制# 补充:元素的名字
scores = c(100,59,73,95,45)
names(scores) = c("jimmy","nicker","Damon","Sophie","tony") #有名字的向量,名字为向量属性
scores代码语言:txt复制## jimmy nicker Damon Sophie tony
## 100 59 73 95 45代码语言:text复制scores["jimmy"]代码语言:txt复制## jimmy
## 100代码语言:text复制scores[c("jimmy","nicker")]代码语言:txt复制## jimmy nicker
## 100 59代码语言:text复制names(scores)[scores>60]代码语言:txt复制## [1] "jimmy" "Damon" "Sophie"代码语言:text复制# 删除
rm(l)
rm(df1,df2)
rm(list = ls())
#快捷键 ctrl l 清空控制台

代码来源于生信技能树


