0 雜談
上游分析 :使用linux ex.轉錄組得到表達矩陣
下游分析:使用R 差異分析灿巧、生存分析
1.R語言基礎
- 管理工作目錄
新建New project - 設置new directory - 新建腳本
從Rproject打開,直接啟動到該目錄下
setwd() #不方便的使用方式
getwd()
- 命令響應
運行 cmd+enter 逐行運行
- 輸出結果
- 報錯:Error
- 警告:Warning
- 運行完成
- 運行中 esc中止
- 進一步選擇 + 中止/補充
- R交互
- 控制臺
- 腳本
Tab:補全函數(shù)/打開選擇目錄
- 數(shù)據(jù)類型
> class("a")
[1] "character"
> class(TRUE)
[1] "logical" #邏輯型/布爾型
> class(3)
[1] "numeric"
邏輯型數(shù)據(jù)判斷
>,<,<=,>=,==,!=
&and |or !not
數(shù)據(jù)類型的判斷和轉換
is.numeric()
is.logical()
is.character()
#判斷
as.numeric()
as.logical()
as.character()
#轉換
c(1,"a") #numeric -> character
c("a",T) #logical -> character T="TRUE"
c(T,2) #logical -> numeric T=1/F=0/NA=NA
#強制轉換
class()
str()#查看變量及變量下所有數(shù)據(jù)類型
#查看數(shù)據(jù)類型
2.1.向量生成??
#(1)用 c() 結合到一起
c(2,5,6,2,9)
c("a","f","md","b")
#(2)連續(xù)的數(shù)字用冒號“:”
1:5
#(3)有重復的用rep(),有規(guī)律的序列用seq(),隨機數(shù)用rnorm
rep("gene",times=3)
seq(from=3,to=21,by=3)
rnorm(n=30)
#(4)通過組合,產生更為復雜的向量昔瞧。
paste0(rep("gene",times=3),1:3)
paste(rep("gene",times=3),1:3,sep = " ") #times = length( )
#簡化原理見下 循環(huán)補齊
2.2對單個向量進行的操作
#(1)賦值給一個變量名
x = c(1,3,5,1) #隨意的寫法
x <- c(1,3,5,1) #規(guī)范的賦值符號Alt+減號
#賦值+輸出一起實現(xiàn)
x <- c(1,3,5,1);x
(x <- c(1,3,5,1))
#(2)簡單數(shù)學計算
x+1
log(x)
sqrt(x)
#(3)根據(jù)某條件進行判斷,生成邏輯型向量
x>3
x==3
#(4)初級統(tǒng)計
max(x) #最大值
min(x) #最小值
mean(x) #均值
median(x) #中位數(shù)
var(x) #方差
sd(x) #標準差
sum(x) #總和
length(x) #長度
unique(x) #去重復
duplicated(x) #對應元素是否重復
!duplicated(x) #返回相反邏輯值
table(x) #重復值統(tǒng)計
sort(x,decreasing = F) #排序
2.3.對兩個向量進行的操作
x = c(1,3,5,1)
y = c(3,2,5,6)
#(1)邏輯比較,生成等長的邏輯向量
x == y
x %in% y #x中的元素在y中嗎
#(2)數(shù)學計算
x + y
#(3)“連接“
paste(x,y,sep=":")
#(4)交集、并集革屠、差集
intersect(x,y)
union(x,y)
setdiff(x,y)
setdiff(y,x)
#當兩個向量長度不一致
x = c(1,3,5,6,2)
y = c(3,2,5)
x == y #warning #循環(huán)補齊
#利用循環(huán)補齊簡化代碼
paste0(rep("gene",3),1:3)
paste0("gene",1:3)
2.4.向量篩選(取子集)
x <- 8:12
#根據(jù)邏輯值取子集
x[x==10]
x[x<12]
x[x %in% c(9,13)]
#根據(jù)位置取子集
x[4]
x[2:4]
x[c(1,5)]
x[-4]
x[-(2:4)]
2.5.修改向量中的某個/某些元素:取子集+賦值
x <- 8:12
x[4] <- 40 #改一個元素
x[c(1,5)] <- c(80,20) #改多個元素
2.6 簡單向量作圖
k1 = rnorm(12);k1
k2 = rep(c("a","b","c","d"),each = 3);k2
plot(k1)
boxplot(k1~k2)
難點--向量匹配排序:match
x <- c("A","B","C","D","E")
y <- c("B","D","E","A","C")
match(x,y)
#[1] 4 1 5 2 3
y[match(x,y)] #根據(jù)x,調整y的順序
df <- df[,match(seq_besoin,colnames(df))] #調整數(shù)據(jù)框列位置
y=c(x[1:n-1],7,x[n:length(x)]) #在x的n位添加
join <- function(x,n,y){ #寫成函數(shù)
c(x[1:n-1],y,x[n:length(x)])
}
x=c(1,3,5,8,6)
join(x,3,7)
重點:數(shù)據(jù)框
1.數(shù)據(jù)框來源
- 在R中新建
- 由已有數(shù)據(jù)轉換或處理得到
- 從文件中讀取
- 內置數(shù)據(jù)集
2.新建和讀取數(shù)據(jù)框
df <- data.frame(gene = c("gene1","gene2","gene3"),
sam = c("sample1","sample2","sample3"),
exp = c(32,34,45))
df <- data.frame(gene = paste0("gene",1:3),
sam = paste0("sample",1:3),
exp = c(32,34,45))
df
df2 <- read.csv("gene.csv") ; df2
3.數(shù)據(jù)框屬性描述
dim(df)
nrow(df)
ncol(df)
rownames(df)
colnames(df)
df[,-ncol(df)]
4.數(shù)據(jù)框取子集
df[2,2]
df[2,]
df[,2]
df[c(1,3),1:2]
df[,"gene"]
df[,c('gene','exp')]
df$exp
mean(df$exp)
5.數(shù)據(jù)框編輯
#改一個格
df[3,3]<- 5
#改一整列
df$exp<-c(12,23,50)
#排宰?
df$abc <-c(23,15,37)
df
#改行名和列名
rownames(df) <- c("r1","r2","r3")
#只修改某一行/列的名
rownames(df)[2]="x"
練習3-1
# 1.讀取excise.csv這個文件似芝,賦值給test。
test <- read.csv("excise.csv")
> test
Petal.Length Petal.Width Species
1 4.6 1.5 versicolor
2 5.9 2.1 virginica
3 4.5 1.5 versicolor
4 6.0 2.5 virginica
5 4.0 1.3 versicolor
6 4.7 1.4 versicolor
7 1.3 0.2 setosa
8 1.4 0.2 setosa
9 5.1 1.9 virginica
10 5.8 2.2 virginica
11 4.9 1.5 versicolor
12 1.4 0.2 setosa
13 1.5 0.2 setosa
14 5.6 1.8 virginica
15 1.4 0.2 setosa
# 2.描述test的屬性(行名列名板甘,行數(shù)列數(shù))党瓮。
dim(test)
nrow(test)
ncol(test)
rownames(test)
colnames(test)
# 3.求第一列數(shù)值的中位數(shù)
median(test[,1])
# 4.修改test前兩列的列名為Length和Width
colnames(test)[1:2] <- c("Length", "Width")
# 5.提取test中,最后一列值為versicolor或setosa的行盐类,組成一個新的數(shù)據(jù)框寞奸,賦值給test2。
test2 <- test[test$Species %in% c("versicolor","setosa"),]
test2 = test[test$Species!="virginica",]
test$Species == c("versicolor","setosa") 錯誤方式在跳,循環(huán)補齊
table(test)
6.數(shù)據(jù)框進階
#截取查看
iris
head(iris)
head(iris,3)
tail(iris)
iris[1:3,1:3]
#查看每一列的數(shù)據(jù)類型和具體內容
str(df)
str(iris)
#去除含有缺失值的行
#生成一個有NA的數(shù)據(jù)框
df<-data.frame(X1 = LETTERS[1:5],X2 = 1:5)
df[2,2] <- NA
df[4,1] <- NA
na.omit(df)
#兩個表格的鏈接
test1 <- data.frame(name = c('jimmy','nicker','doodle'),
blood_type = c("A","B","O"))
test1
test2 <- data.frame(name = c('doodle','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('doodle','jimmy','lucy','nicker'),
weight = c(140,145,110,138))
tmp =merge(test1,test2,by="name")
merge(test1,test3,by.x = "name",by.y = "NAME")
cbind(test2,test3) #rows數(shù)量和名稱相同
rbind(test1,test3) #cols數(shù)量和名稱相同
矩陣和列表
m <- matrix(1:9, nrow = 3)
colnames(m) <- c("a","b","c") #列名
#轉置和轉換
m
t(m)
as.data.frame(m)
pheatmap::pheatmap(m) #默認聚類
pheatmap::pheatmap(m,cluster_cols = F,cluster_rows = F)
#列表
l <- list(m=matrix(1:9, nrow = 3),
df=data.frame(gene = paste0("gene",1:3),
sam = paste0("sample",1:3),
exp = c(32,34,45)),
x=c(1,3,5))
l
l[[2]]
l$df
補充:元素的名字
#(1)向量
x=1:10
names(x)=letters[1:10]
x
x["a"]
#(2)數(shù)據(jù)框
df
names(df)
df[,"X1"]
#(3)列表
names(l)
l[["df"]]
練習3-2
# 1.統(tǒng)計iris最后一列有哪幾個取值枪萄,每個取值重復了多少次
table(iris[,ncol(iris)])
# 2.提取iris的前10行,前4列猫妙,并轉換為矩陣瓷翻,賦值給a。
a <- as.matrix(iris[1:10,1:4])
# 3.將a的行名改為flower1割坠,flower2...flower10齐帚。
rownames(a)[1:10] <- paste0("flower",1:nrow(a))
# 4.將a的第4到7行刪除(提示:刪除也是一種修改)
a <- a[-(4:7),]
# 5.b = rnorm(3),將a和b組成一個列表,賦值給x
x <- list(a, b = rnorm(3));x #未命名a
x <- list(a = a, b = rnorm(3));x
# 6.探索x[2]和x[[2]]的區(qū)別(提示:數(shù)據(jù)結構)
class(x[2])
class(x[[2]])
class(x[[2]][1])
# 8.探索:列表x的元素有名字(names)嗎彼哼?
names(x)
names(x) <- c("a","b")
刪除
#刪除一個變量
rm(l)
#刪除多個變量
rm(df,m)
#刪除全部變量
rm(list = ls())
#清空控制臺
control+l
替換基因名簡易代碼
(想起了曾經這個步驟用了十幾行代碼童谒,思路麻煩至極)
colnames(y) <- x[match(colnames(y),x$file_name),]$ID
ou
colnames(y) <- x$ID[match(colnames(y),x$file_name)]
R語言中的排序,集合運算沪羔,reshape,以及merge總結