生信课程note-3

2023-02-09 11:37:29 浏览数 (1)

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]])

引自生信技能树

0 人点赞