生信马拉松 Day3

2024-01-12 13:32:14 浏览数 (2)

今天延续Day2讲完了全部的几个重要数据类型,都是后续生信分析非常重要的知识点以及小Tips,同时深深感受到代码思维的重要性。要写能换个环境和场景依然可运行的代码,而不是一次性的玩意儿

总览

“向量”一维

matrix 矩阵——二维,只允许一种数据类型

data.frame 数据框——二维,每列只允许一种数据类型

list 列表——可装万物

首先是最重要的数据框

数据框来源

(1)用代码新建

(2)由已有数据转换或处理得到

(3)读取表格文件

(4)R语言内置数据

1.新建和读取数据框

代码语言:R复制
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

2.数据框的属性

数据框的维度是行数和列数

代码语言:R复制
dim(df1)
nrow(df1) #有多少行
ncol(df1) #有多少列

rownames(df1) #取行名
colnames(df1) #取列名

3.数据框取子集

代码语言:R复制
df1$score  #删掉score,按tab键可以选择其他列名
mean(df1$score) #对df1$score取平均值
## 按坐标
df1[2,2]
df1[2,]
df1[,2]
df1[c(1,3),1:2]
## 按名字
df1[,"gene"]
df1[,c('gene','change')]   #这个方法相比$的优点是易读 可以提取多列

4.数据框修改

代码语言:R复制
#改一个格
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"

5.两个数据框的连接

merge真的不要太常用,但是实操两个数据集对应的列名不一样的时候,就好容易忘记其实可以写在参数里╭(╯^╰)╮

代码语言:R复制
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") 
#这里by.x对应写的第一个数据集,by.y对应第二个数据集
#除了merge之外,tidyr包的left-join也是很常用的合并函数
#处理生信文件的时候两者差别不大,但应对文字信息的数据清洗,left-join更少报错

6.按逻辑值筛选数据库的数据

代码语言:R复制
df1 <- data.frame(gene   = paste0("gene",1:4),
                  change  = rep(c("up","down"),each = 2),
                  score   = c(5,3,-2,-4))
df1[df1$score>0,]

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

矩阵和列表

代码语言:R复制
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)
#列表
x <- list(m1 = matrix(1:9, nrow = 3),
          m2 = matrix(2:9, nrow = 2))
x

x[[1]]
x$m1
#x[[1]]是matrix,x[1]是list

TIPS

1.神奇的利用循环补齐 取特定数据

代码语言:R复制
x=1:8;x
#[1] 1 2 3 4 5 6 7 8

x[c(T,F)]   #利用循环补齐取出奇数位的数据
#[1] 1 3 5 7

x[c(F,T)]   #利用循环补齐取偶数位的数据
[1] 2 4 6 8

2.代码思维取数据框的最后一列,以及除了最后一列以外的其他列

这个在实际写代码的时候真的很容易忘记,当时急着用写上数字后面copy到其他数据里就要反复改

代码语言:R复制
df1[,ncol(df1)]
df1[,-ncol(df1)]

3.删除

其实偶尔也会有删除单个变量的需求,很实用的小代码

代码语言:R复制
rm(x)
rm(df1,df2)
rm(list = ls()) 

4.其他读series.matrix文件的函数

代码语言:R复制
a=read.delim('GSE217012_Normalized_RPKM_LOG2_matrix.txt.gz') 
#以前只知道用read.table加很多参数来读,这个还挺新奇的

5.默认的heatmap函数只能对matrix进行作图

(这个以前从来没注意过,都是无脑转data.frame,matrix分析的时候很容易报错,今天小洁老师特地讲了series matrix读取之后可以用as.matrix转换,好奇后续的作用,盲猜可能是有时分析和作图需要对数据转置,但是那些函数往往会自动把dataframe转化为matrix,之前分析的时候倒是感觉要记得把自动变格式的数据转回来是要点,有点期待~)

生信技能树 生信马拉松

0 人点赞