生信技能树-R语言-day3

2024-04-19 14:44:41 浏览数 (2)

上次作业:

代码语言:r复制
#向量g中有多少个元素在向量s中存在(要求用函数计算出具体个数)?将这些元素筛选出来
#提示:%in%
length(g %in% s) # 错误,因为%in%产生的逻辑值中,T和F都存在,所以都会被计算个数,相当于length计算的是逻辑值的个数
g[g %in% s]
#正确答案
table(g %in% s)
sum(g %in% s) # sum也可以
length(intersect(g,s)) #交集会去掉重复
g[s %in% g] #只对s负责,和g没有关系

#生成10个随机数: rnorm(n=10,mean=0,sd=18),用向量取子集的方法,取出其中小于-2的值
a = rnorm(n=10,mean=0,sd=18);a
a[a<-2] # 错误,<- 是赋值的符号
#正确答案
a[a<(-2)] # 拆开<-
a[a< -2] # 拆开<-

一维:向量

二维:

  • 矩阵matrix 只有一种数据源类型
  • 数据框 data.frame 每列只有一种数据类型

list列表:可以装的下一切(数据,向量,矩阵,数据框)


数据框 新建

  1. 新建数据框data.frame()
  2. 读取数据框 read.csv()
代码语言:r复制
> 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
代码语言:r复制
> df2 <- read.csv("gene.csv")
> df2   
  gene change score
  1 gene1     up     5
  2 gene2     up     3
  3 gene3   down    -2
  4 gene4   down    -4

数据框的属性

代码语言:r复制
> dim(df1)# 列和行分别有几个子集

> nrow(df1)# 有几个子集行

 > ncol(df1)# 有几个子集列
  
 > rownames(df1)# 行分别有几个子集名字
 [1] "1" "2" "3" "4"
 
 > colnames(df1)#列分别有几个子集名字
 [1] "gene"   "change" "score"

取子集

  1. $
  2. 按照坐标:数据框[ 行 , 列 ]
  3. 按照名字:数据框[ “行名字” , “列名字” ]
  4. 按照逻辑值:数据框$
代码语言:r复制
> 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
  
  > k = df1$score>0;k
[1]  TRUE  TRUE FALSE FALSE
> df1[k,]  # [ ] 取ture对应的子集,按照逻辑值取子集,所以保留了score>0的数据   
   gene change score
1 gene1     up     5
2 gene2     up     3  #因为是一个矩阵,所以要有逗号来区分行和列

数据的修改

  1. 修改一个数据

文件名[第几行 ,第几列] = 赋值修改后的数据

  1. 修改一个列的数据

文件名$列名 = c()赋值修改后的向量(先提取一个列$,再修改)

  1. 增加一列的数据

文件名$列名 = c()赋值修改后的向量($提取的是一个全新的列名,之前不存在的)

  1. 修改行名

rownames() = c()赋值修改后的向量 (行名都是一样的)

  1. 修改其中一列的列名

colnames(文件名)[第几列]= “”赋值列的名字(每一列名字都不一样)

两个数据框的连接:

  • merge(数据框1,数据框2,by = “共同列的名字”) (有一个相同列的名字)
  • merge(数据框1,数据框2,by.x = “x列的名字”, by.y = “y列的名字”) (没有相同的列的名字)

矩阵 新建 (不适用$提取)

m = matrix(向量,nrow = 分成多少行就写几的数字 )

矩阵的行 列 写成了[]形式

代码语言:r复制
> m <- matrix(1:9, nrow = 3) # 1:9 是一个向量,把他们排成三行
> m     
      [,1] [,2] [,3]
[1,]    1    4    7
[2,]    2    5    8
[3,]    3    6    9

矩阵取子集m[x,y]

矩阵的转置和转换 t()

转置(将行和列互转,要先给列改名,不然转置没有区别

代码语言:r复制
> colnames(m) <- c("a","b","c") #加列名  不支持$取
> 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

转换为数据框 m = as.data.frame()

可以用class来判断是否转换成功


list列表 新建

代码语言:r复制
> 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. [ [] ]

删除变量

删除一个:rm()

删除多个:rm( , )

删除全部:rm(list = ls())

清空控制台:contral l


  • 如何判断是矩阵还是数据框
  1. 根据生成她的函数
  2. 用class和is族函数判断
  • pheatmap::pheatmap(m)
  • 给元素补充名字

names() = c("")

生信技能树 day3 上课笔记

0 人点赞