今天延续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,之前分析的时候倒是感觉要记得把自动变格式的数据转回来是要点,有点期待~)
生信技能树 生信马拉松