class3
数据框、矩阵和列表
向量-一维:
表格—二维 :
matrix 矩阵-二维,只允许一种数据类型;data.frame数据框-二维,每列只允许一种数据类型。
list列表:可装万物 向量 矩阵 数据框 数字 列表 。
用class可以判断是矩阵或数据框,还可以用is族函数来判断。
#重点:数据框
#1.数据框来源
# (1)用代码新建
# (2)由已有数据转换或处理得到
# (3)读取表格文件 (对数据框操作)
# (4)R语言内置数据 (可以直接使用的的数据框)heatmap(volcano) ,iris,letters,LETTERS
是r语言内部的数据,可以导出为表格文件打开,但没办法用别的软件直接打开数据框。
#2.新建和读取数据框
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
#3.数据框属性
#维度、行、列
dim(df1)
nrow(df1)
ncol(df1)
#行名,列名
rownames(df1)
colnames(df1)
#4.数据框取子集
df1$score 向量取子集用的是[] 取score这一列
df1$gene #删掉score,按tab键试试
mean(df1$score)
## 按坐标
df1[2,2]
df1[2,] 第二行
df1[,2]
df1[c(1,3),1:2] 1,3行,1,2列 向量是x[c(1,5)]即第一个和第五个数
## 按名字
df1[,"gene"]
df1[,c("gene","change")]
df1[,c('gene','change')]
## 按条件(逻辑值)
df1[df1$score>0,] ,取出score>0的行。¥df1[df1$score>0,"gene"]/df1[df1$score>0,1]/df1$gene[df1$score>0],取出score>0的基因。
用于取子集的逻辑值向量:
与x对应,不必须由x生成。(例子中即通过score为gene取子集)
记住,==是等于的意思,>-是赋值的意思
## 代码思维
#如何取数据框的最后一列?
df1[,3]
df1[,ncol(df1)]
#如何取数据框除了最后一列以外的其他列?
df1[,-ncol(df1)] 注:!-给数值用,!给逻辑值用。
#筛选score > 0的基因
df1[df1$score > 0,1]
df1$gene[df1$score > 0]
#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"
列名和行名都是向量
#6.两个数据框的连接
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")
##### 矩阵和列表
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):转置 行变列
m<-as.data.frame(m) 转换为数据框 必须要赋值
矩阵画热图: pheatmap::pheatmap(m) 热图中的黑线是聚类树
pheatmap::pheatmap(m,cluster_cols = F,cluster_rows = F) 此代码是去除聚类
#列表
新建和取子集
l <- list(m1 = matrix(1:9, nrow = 3),
m2 = matrix(2:9, nrow = 2))
l
列表的下一级也叫元素。
l[[2]]
l$m1
# 补充:元素的名字 向量的名字
scores = c(100,59,73,95,45)
names(scores) = c("jimmy","nicker","Damon","Sophie","tony")
scores
结果:jimmy nicker Damon Sophie tony
100 59 73 95 45
取子集:
scores["jimmy"] 结果100
scores[c("jimmy","nicker")]
names(scores)[scores>60]
# 删除
rm(l) 删除一个
rm(df1,m)删除多个
rm(list=ls())删除全部
清空控制台ctrl l
而扫把标志仅仅是删除记录,数据还在。
rm(df1,df2)
rm(list = ls())
改变列的顺序
a <- a[,c(1,3,4,2)]
练习3-1
# 练习3-1
# 1.读取exercise.csv这个文件,赋值给test。
test <- read.csv("exercise.csv")
# 2.求test第一列数值的中位数
median(test$Petal.Length)
# 3.筛选test中,Species列的值为a或c的行
test[test$Species!="b",]
test[test$Species=="a"|test$Species=="c",]
test[test$Species %in% c("a","c"),]
练习3-2
# 练习3-2
# 1.统计内置数据iris最后一列有哪几个取值,每个取值重复了多少次
iris[,ncol(iris)]
table(iris$Species)
# 2.提取内置数据iris的前5行,前4列,并转换为矩阵,赋值给a。
class(iris)
iris[(1:5),(1:4)]
a <- iris[(1:5),(1:4)]
a <- as.matrix(a)
a
class(a)
# 3.将a的行名改为flower1,flower2...flower5。
rownames(a) <- c("flower1","flower2","flower3","flower4","flower5")
rownames(a) <- paste0("flower",1:nrow(a))
a
# 4.探索列表取子集l[2]和l[[2]]的区别(提示:数据结构)
class(l[2])
class(l[[2]])
引自生信技能树