數(shù)據(jù)結構之數(shù)據(jù)框、矩陣和列表
要經(jīng)常檢查代碼生成的結果,警惕不報錯的錯誤
向量:一維
表格:二維
列表:三維
判斷數(shù)據(jù)結構:class()或is族函數(shù)判斷,或根據(jù)其生成的函數(shù)來判斷
數(shù)據(jù)框(Data.frame)
二維,每列只允許一種數(shù)據(jù)類型
數(shù)據(jù)框來源
- 用代碼新建
- 由已有數(shù)據(jù)轉換或處理得到
- 讀取表格文件
- R語言內(nèi)置數(shù)據(jù)(iris,volcano等)
數(shù)據(jù)框新建
data.frame()
變量名稱只起到提示作用,不起決定作用
df1 <- data.frame(gene = paste0("gene",1:4),
change = rep(c("up","down"),each = 2),
score = c(5,3,-2,-4))
df1
## gene change score
## 1 gene1 up 5
## 2 gene2 up 3
## 3 gene3 down -2
## 4 gene4 down -4
df2 <- read.csv("gene.csv") #讀取文件
數(shù)據(jù)框屬性
dim()
維度(dimension)
nrow()
行;rownames()
行名
ncol()
列;colnames()
列名
數(shù)據(jù)框取子集
-
取某一列:
$
取數(shù)據(jù)框中的一列,按Tab
鍵自動補齊df1$score ## [1] 5 3 -2 -4
-
按坐標:
[行號,列號]
df1[2,2] ## [1] "up" df1[2,] ## gene change score ## 2 gene2 up 3 df1[,2] ## [1] "up" "up" "down" "down" df1[c(1,3),1:2] ## gene change ## 1 gene1 up ## 3 gene3 down
-
按名字:
[行名,列名]
## 按名字 df1[,"gene"] ## [1] "gene1" "gene2" "gene3" "gene4" df1[,c('gene','change')] ##可以按名字同時取多列,使代碼變得易讀 ## gene change ## 1 gene1 up ## 2 gene2 up ## 3 gene3 down ## 4 gene4 down
- 中括號里的逗號,表示維度的分割
數(shù)據(jù)框修改
-
修改:將需要修改的內(nèi)容提取后進行重新賦值
df1[3,3] <- 5 df1 ## gene change score ## 1 gene1 up 5 ## 2 gene2 up 3 ## 3 gene3 down 5 ## 4 gene4 down -4 df1$score <- c(12,23,50,2) df1 ## gene change score ## 1 gene1 up 12 ## 2 gene2 up 23 ## 3 gene3 down 50 ## 4 gene4 down 2
-
新建:
$
后接尚未存在的列名,即是新建列df1$p.value <- c(0.01,0.02,0.07,0.05) df1 ## gene change score p.value ## 1 gene1 up 12 0.01 ## 2 gene2 up 23 0.02 ## 3 gene3 down 50 0.07 ## 4 gene4 down 2 0.05
-
修改列名或行名
將行名和列名視為向量去做修改
#改行名和列名 rownames(df1) <- c("r1","r2","r3","r4") #只修改某一行/列的名 colnames(df1)[2] <- "CHANGE"
兩個數(shù)據(jù)框的連接
-
兩個數(shù)據(jù)框根據(jù)有交集的一列合并(取交集)
test1 <- data.frame(name = c('jimmy','nicker','Damon','Sophie'), blood_type = c("A","B","O","AB")) test1 ## name blood_type ## 1 jimmy A ## 2 nicker B ## 3 Damon O ## 4 Sophie AB 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 ## name group vision ## 1 Damon group1 4.2 ## 2 jimmy group1 4.3 ## 3 nicker group2 4.9 ## 4 tony group2 4.5 merge(test1,test2,by="name") ## name blood_type group vision ## 1 Damon O group1 4.2 ## 2 jimmy A group1 4.3 ## 3 nicker B group2 4.9 test3 <- data.frame(NAME = c('Damon','jimmy','nicker','tony'), weight = c(140,145,110,138)) test3 ## NAME weight ## 1 Damon 140 ## 2 jimmy 145 ## 3 nicker 110 ## 4 tony 138 merge(x=test1,x=test3,by.x = "name",by.y = "NAME") ## name blood_type weight ## 1 Damon O 140 ## 2 jimmy A 145 ## 3 nicker B 110
-
取合集:查看幫助文檔
- 代碼和數(shù)據(jù)不匹配:改數(shù)據(jù)/改代碼
數(shù)據(jù)框按照邏輯值取子集【有點難】
df1 <- data.frame(gene = paste0("gene",1:4),
change = rep(c("up","down"),each = 2),
score = c(5,3,-2,-4))
k = df1$score>0;k
## [1] TRUE TRUE FALSE FALSE
df1[k,]
## gene change score
## 1 gene1 up 5
## 2 gene2 up 3
- 將滿足K這一條件的行提取出來。
篩選score > 0的基因,如下兩種寫法
df1[k,1]
## [1] "gene1" "gene2"
df1$gene[k]
## [1] "gene1" "gene2"
df1$gene[df1$score>0]
## [1] "gene1" "gene2"
矩陣(Matrix)
二維,只允許一種數(shù)據(jù)類型
矩陣新建和取子集
-
新建:matrix(), nrow/ncol設置行數(shù)或列數(shù)
m <- matrix(1:9, nrow = 3) colnames(m) <- c("a","b","c") #加列名 m ## a b c ## [1,] 1 4 7 ## [2,] 2 5 8 ## [3,] 3 6 9
-
取子集與數(shù)據(jù)框相同
m[2,] ## a b c ## 2 5 8 m[,1] ## [1] 1 2 3 m[2,3] ## c ## 8 m[2:3,1:2] ## a b ## [1,] 2 5 ## [2,] 3 6
矩陣的轉置和轉換
-
轉置:
t()
以1 5 9為中軸轉置m ## a b c ## [1,] 1 4 7 ## [2,] 2 5 8 ## [3,] 3 6 9 t(m) ## [,1] [,2] [,3] ## a 1 2 3 ## b 4 5 6 ## c 7 8 9
-
轉換:所有矩陣可以轉換成數(shù)據(jù)框
as.data.frame()
as.data.frame(m) ## a b c ## 1 1 4 7 ## 2 2 5 8 ## 3 3 6 9
- 沒有賦值就沒有發(fā)生變化!運行完
as.data.frame(m)
后m還是矩陣
- 沒有賦值就沒有發(fā)生變化!運行完
矩陣畫熱圖
熱圖函數(shù)heatmap
需求矩陣數(shù)據(jù)類型
pheatmap::pheatmap(m)
- 熱圖給數(shù)據(jù)進行了聚類,將相似性高的行/列放在一起展示。這是該函數(shù)的默認值。
pheatmap::pheatmap(m,cluster_cols = F,cluster_rows = F)
- 更改參數(shù)后,此時圖和矩陣完全一致。
- 當默認不符合預期時,可以在作者允許的范圍內(nèi)自定義。
列表(List)
列表新建和取子集
-
新建:
list()
,列表的每個元素可以是任何數(shù)據(jù)結構和類型x <- list(m1 = matrix(1:9, nrow = 3), m2 = matrix(2:9, nrow = 2)) x ## $m1 ## [,1] [,2] [,3] ## [1,] 1 4 7 ## [2,] 2 5 8 ## [3,] 3 6 9 ## ## $m2 ## [,1] [,2] [,3] [,4] ## [1,] 2 4 6 8 ## [2,] 3 5 7 9
-
取子集:
[[]]
和$
-
[[]]
中接元素的序號或名字x[[1]] ## [,1] [,2] [,3] ## [1,] 1 4 7 ## [2,] 2 5 8 ## [3,] 3 6 9
-
$
后接元素名字,可以tab補齊x$m1 ## [,1] [,2] [,3] ## [1,] 1 4 7 ## [2,] 2 5 8 ## [3,] 3 6 9
-
元素的名字names()
列表的元素有名字,向量的元素也可以有名字文章來源:http://www.zghlxwxcb.cn/news/detail-838549.html
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仍然是數(shù)值型,名字不影響數(shù)據(jù)類型。
#應用!
scores["jimmy"]
## jimmy
## 100
scores[c("jimmy","nicker")]
## jimmy nicker
## 100 59
names(scores)[scores>60]
## [1] "jimmy" "Damon" "Sophie"
刪除變量
- 刪除某個變量
rm(x)
- 刪除多個變量
rm(df1,df2)
- 刪除環(huán)境中所有變量
rm(list = ls())
最常用 - 清空控制臺
Ctrl+L
-
tibble::column_to_rownames()
可以將第一列變成行名,然后刪除第一列 - 另:一個有趣但不好理解的事情——數(shù)據(jù)框是一種特殊的列表。
數(shù)據(jù)框封裝了列(向量),列表封裝什么都可以(個人理解,故此[[]]
和$
取列和取列表元素相同
以上來自生信技能樹課程!給小潔老師比心~文章來源地址http://www.zghlxwxcb.cn/news/detail-838549.html
到了這里,關于學習筆記Day3:數(shù)據(jù)框、矩陣和列表的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網(wǎng)!