当前位置:   article > 正文

学习笔记Day3:数据框、矩阵和列表_矩阵列表数据框

矩阵列表数据框

数据结构之数据框、矩阵和列表

要经常检查代码生成的结果,警惕不报错的错误

向量:一维

表格:二维

列表:三维

判断数据结构:class()或is族函数判断,或根据其生成的函数来判断

数据框(Data.frame)

二维,每列只允许一种数据类型

数据框来源

  1. 用代码新建
  2. 由已有数据转换或处理得到
  3. 读取表格文件
  4. R语言内置数据(iris,volcano等)

数据框新建

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")   #读取文件
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11

数据框属性

dim()维度(dimension)

nrow()行;rownames()行名

ncol()列;colnames()列名

数据框取子集

  1. 取某一列:$取数据框中的一列,按Tab键自动补齐

    df1$score
    
    ## [1]  5  3 -2 -4
    
    • 1
    • 2
    • 3
  2. 按坐标:[行号,列号]

    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
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
  3. 按名字:[行名,列名]

    ## 按名字
    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
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
  • 中括号里的逗号,表示维度的分割

数据框修改

  1. 修改:将需要修改的内容提取后进行重新赋值

    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
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
  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
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
  3. 修改列名或行名

    将行名和列名视为向量去做修改

    #改行名和列名
    rownames(df1) <- c("r1","r2","r3","r4")
    #只修改某一行/列的名
    colnames(df1)[2] <- "CHANGE"
    
    • 1
    • 2
    • 3
    • 4

两个数据框的连接

  1. 两个数据框根据有交集的一列合并(取交集)

    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
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
  2. 取合集:查看帮助文档

  • 代码和数据不匹配:改数据/改代码

数据框按照逻辑值取子集【有点难】

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
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 将满足K这一条件的行提取出来。
    在这里插入图片描述
    筛选score > 0的基因,如下两种写法
df1[k,1]
## [1] "gene1" "gene2"
df1$gene[k]
## [1] "gene1" "gene2"
df1$gene[df1$score>0]
## [1] "gene1" "gene2"
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

矩阵(Matrix)

二维,只允许一种数据类型

矩阵新建和取子集

  1. 新建:matrix(), nrow/ncol设置行数或列数

    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
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
  2. 取子集与数据框相同

    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
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

矩阵的转置和转换

  1. 转置: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
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
  2. 转换:所有矩阵可以转换成数据框as.data.frame()

    as.data.frame(m)
    ##   a b c
    ## 1 1 4 7
    ## 2 2 5 8
    ## 3 3 6 9
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 没有赋值就没有发生变化!运行完as.data.frame(m)后m还是矩阵

矩阵画热图

热图函数heatmap需求矩阵数据类型

pheatmap::pheatmap(m)
  • 1

在这里插入图片描述

  • 热图给数据进行了聚类,将相似性高的行/列放在一起展示。这是该函数的默认值。
pheatmap::pheatmap(m,cluster_cols = F,cluster_rows = F)
  • 1

在这里插入图片描述

  • 更改参数后,此时图和矩阵完全一致。
  • 当默认不符合预期时,可以在作者允许的范围内自定义。

列表(List)

列表新建和取子集

  1. 新建:list(),列表的每个元素可以是任何数据结构和类型

    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
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
  2. 取子集:[[]]$

    • [[]]中接元素的序号或名字

      x[[1]]
      ##      [,1] [,2] [,3]
      ## [1,]    1    4    7
      ## [2,]    2    5    8
      ## [3,]    3    6    9
      
      • 1
      • 2
      • 3
      • 4
      • 5
    • $后接元素名字,可以tab补齐

      x$m1
      ##      [,1] [,2] [,3]
      ## [1,]    1    4    7
      ## [2,]    2    5    8
      ## [3,]    3    6    9
      
      • 1
      • 2
      • 3
      • 4
      • 5

元素的名字names()

列表的元素有名字,向量的元素也可以有名字

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
  • 1
  • 2
  • 3
  • 4
  • 5
  • scores仍然是数值型,名字不影响数据类型。
#应用!
scores["jimmy"]
## jimmy 
##   100
scores[c("jimmy","nicker")]
##  jimmy nicker 
##    100     59
names(scores)[scores>60]
## [1] "jimmy"  "Damon"  "Sophie"
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

删除变量

  1. 删除某个变量 rm(x)
  2. 删除多个变量rm(df1,df2)
  3. 删除环境中所有变量rm(list = ls()) 最常用
  4. 清空控制台Ctrl+L
  • tibble::column_to_rownames()可以将第一列变成行名,然后删除第一列
  • 另:一个有趣但不好理解的事情——数据框是一种特殊的列表。
    数据框封装了列(向量),列表封装什么都可以(个人理解,故此[[]]$取列和取列表元素相同

以上来自生信技能树课程!给小洁老师比心~

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/笔触狂放9/article/detail/709747
推荐阅读
相关标签
  

闽ICP备14008679号