美文网首页
二、数据结构

二、数据结构

作者: 白米饭睡不醒 | 来源:发表于2021-01-13 20:13 被阅读0次

    1. 数据结构

    (1)向量为一维,只有长度(sample函数为从1到100中任取28个数字)

    SWMPQ`ME0FPCZST3L@L6OEN.png
    (2)矩阵有两个维度,长度相同,数据类型相同(matrix函数为把向量x变为7行的矩阵)
    2.png
    matrix(x,nrow = )#把向量变成几行的矩阵
    cbind(x1,x2,x3)#把几个向量组合成一个矩阵
    
    3.png
    (3)数据框:多个长度相同,数据类型可以不同的向量按列组合
    data.frame(y1,y2,y3)
    

    (4)list 列表:长度可以不相同,数据类型也可以不同的数据

    2.数据框

    (1) 数据框来源
    a.在R中新建 b. 由已有数据转换或处理得到 c. 从文件中读取 d. 内置数据集
    (2)新建数据框


    4.png

    (列的内容为向量,列与列以逗号分隔)

    options(stringsAsFactors = F)#3.6及以下要运行,4.0不用
    df <- data.frame(gene = c("gene1","gene2","gene3"),
                     sam  = c("sample1","sample2","sample3"),
                     exp  = c(32,34,45))
    df
    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.数据框属性描述

    #维度(有几行几列)
    dim(df)#返回行数和列数
    nrow(df)#行数
    ncol(df)#列数
    #行名/列名
    rownames(df)
    colnames(df)
    

    4.数据框取子集

    df[2,2]#取一个
    df[2,]#取一行,逗号左边是行右边是列,不选等于全选
    df[,2]#取一列
    df[c(1,3),1:2]#前面为取第一行和第三行,后面取第一列和第二列
    
    df[,"gene"]#根据行名和列名取
    df[,c('gene','exp')]#取两列
    nn=c('gene','exp');df[,nn]#等同于上面但此方式变换变量时更方便
    df[,ncol(df)]#取最后一列
    df[,ncol(df)]#去掉最后一列
    
    df$exp  #取一列的简单方法,按tab键出现列名自动补齐,$只能取一列不能取多列
    mean(df$exp)#取均值,能对向量进行的计算和统计,都能对df$exp做
    

    (中括号里的逗号,表示维度的分割)

    5.数据框编辑

    #改一个格
    df[3,3]<- 5#把数据框的第三行第三列改成5
    #改一整列
    df$exp<-c(12,23,50)#一列改成一个向量,如果只改成一个数字就全等于一个数字     
    #增加一列,且列名为abc
    df$abc <-c(23,15,37) 
    df
    #改行名和列名
    rownames(df) <- c("r1","r2","r3")
    #只修改某一行/列的名,取子集再赋值
    rownames(df)[2]="x"
    

    6.数据框进阶

    (1)去除含有缺失值的行

    #生成一个有NA的数据框(仅按照某一列来去除缺失值、缺失值替换:tidyr包)
    df<-data.frame(X1 = LETTERS[1:5],X2 = 1:5)
    df[2,2] <- NA
    df[4,1] <- NA
    df
    
    na.omit(df)
    

    (2)两个表格的连接(交集、并集、补集、全集等,参照dplyr包)

    1.png
    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")#两列名字不一样的时候
    

    (3)矩阵新建和取子集($只适用于数据框和列表取子集,不适用矩阵)

    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)#转换为数据框
    pheatmap::pheatmap(m)#画热图
    

    (4)列表新建和取子集

    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]]#向量df如果未定义名字就可写为这个,列表的向量分别为[[1]]、[[2]]、[[3]]
    l$df
    

    (5)删除变量

    22.png
    #删除 
    #删除一个
    rm(l)
    #删除多个
    rm(df,m)
    #删除全部
    rm(list = ls()) 
    

    (6)元素的名字

    #(1)向量
    x=1:10
    names(x)=letters[1:10]
    x
    x["a"]#根据名字取子集
    #(2)数据框
    df
    names(df)
    df[,"X1"]
    #(3)列表
    names(l)
    l[["df"]]
    

    练习

    #1.统计iris最后一列有哪几个重复值,分别重复了多少次
    table(iris$Species)#重复值提取用table,数据框提取一列
    #2.提取iris的前4列,并转换为矩阵,赋值给test。
    test <- as.matrix(iris[,1:4])
    #3.将test的行名改为flower1,flower2...flower149,flower150。
    rownames(test) <- paste0("flower",1:nrow(test))
    #4.将test的第51到100行删除(不能用rm因为rm删除的是整个变量)
    test <- test[-(51:100),]
    #5.将iris和test组成一个列表,赋值给tl
    tl <- list(x1=iris,x2=test)
    #6.提取tl的第二个元素
    tl[[2]]
    tl$x2
    identical(tl([2],tl[[2]])#判断两个数据类型是否相同
    #7.修改tl第二个元素的名字为td
    names(tl)[2] <- "td"
    

    7. 数据框修改

    df[3,3]<-5#改一个格
    
    df$exp<-c(12,23,50)#$后的列名若存在则为修改该列的内容
    
    df$abc<-c(23,4,67)#$后的列名若不存在则表示新增一列
    

    * 误操作时

    重新运行数据框赋值原命令然后再进行正确操作(运行错了的代码不能撤销,但可以覆盖,多次赋值以最后以此为准 )

    8. match使用

    两个顺序不一致的表格相匹配

    #方法一
    load("matchtest.Rdata")
    x$file_name
    colnames(y)
    match(x$file_name,colnames(y))#返回了y按x顺序排列的下标
    a=match(x$file_name,colnames(y))
    y=y[,a]#调整y的顺序,排列成和x一样的
    identical(x$file_name,colnames(y))#判断调整的是否正确
    colnames(y)=x$ID
    
    #方法二
    load("matchtest.Rdata")
    colnames(y)=x$ID[match(colnames(y),x$file_name)]
    
    

    相关文章

      网友评论

          本文标题:二、数据结构

          本文链接:https://www.haomeiwen.com/subject/gkgxaktx.html