生信人

找回密码
立即注册
搜索
热搜: 活动 交友 discuz
发新帖

0

收听

12

听众

279

主题
发表于 2022-8-10 12:54:33 | 查看: 555| 回复: 0
本帖最后由 生信喵 于 2022-8-22 15:54 编辑

背景
       在使用R语言过程中,每一步中都需要关注R语言的数据结构。数据结构是R语言中最重要的内容,也是最难的一部分,学会了这部分之后,R语言就不难了。很多时候,函数无法运行,都是因为数据结构的问题。在学习R语言数据结构之前需要首先了解下数据的类型。
一、数据类型
       数据类型主要表示数据代表哪种内容,是字符串还是数值,逻辑值,或者时间日期等。数值可以用于计算,字符串不能用来计算,逻辑值用来判断等。
      
       Excel 中数据类型
       数值类型
类型 说明
字符(charactor) 常常被引号包围
数值(numeric) 实数向量
复数(complex) 复数向量
逻辑(logical) 二元逻辑向量(T=TRUE, F=FALSE)


二、常用数据结构
       R的数据结构主要包括以下几种,每一种都有固定的用处,学习R语言需要非常熟悉每一种数据结构的特点。

       R 中常用数据结构
数据结构 说明 允许多种类型
1 向量(vector) 最基本的类型
2 因子(factor) 表示类别/分类数据
3 数组(array) 带下标的多维数据集合
4 矩阵(matrix) 二维数组
5 数据框(data frame) 行和列组成的表,每列可以是不同数据类型
6 列表(list) 不同对象的有序集合
7 时间序列 根据时间顺序排列的数据
8 不同数据组合
       R 中常用数据结构

三、内置数据集
       R 语言的一个好处是内置了大量数据集,一般 R 扩展包也包含数据集,这样无需自己准备输入文件,可以很方便的重复案例的内容。启动 R 之后,默认已经加载了 datasets 包,里面包含了大量数据集,使用 data()函数可以显示所有数据集。直接敲数据集的名字就能够打印出数据集的内容,内置数据集与自己通过文件将数据读入 R 中,存储为变量效果上是一样的。
  1. # 显示所有内置数据集
  2. data()
  3. #加载扩展包数据集
  4. data(package = "MASS")
  5. data(package = "ggplot2")
复制代码

四、向量
       向量:vector,是 R 中最重要的一个概念,它是构成其他数据结构的基础。向量其实是用于存储数值型、字符型或逻辑型数据的一维数组。R 中的向量与解析几何或者物理学中有数值和方向的量不同,R 中的向量是一个集合,即可以是数值的集合也可以是字符串或者逻辑值的集合。其余数据结构都由向量构成。
4.1 创建向量
       用函数c来创建向量。c代表concatenate连接,也可以理解为收集collect,或者合并combine。新手经常犯的错误就是忘了使用 c()函数。
  1. #R 内置向量
  2. rivers
  3. euro
  4. plot(rivers)  
  5. hist(rivers)  
  6. names(euro)  
  7. length(euro)  
  8. a <- c(1,2,3)  
  9. #字符型向量
  10. b <- c("red","green","blue")
  11. #生成连续型向量
  12. c <- seq(1,100,2)  
  13. d <- rep(c(1,2),5)  
  14. seq(1,100,2)
  15. seq(from = 1,to = 100,by = 3)
  16. seq(from = 1,to = 100,length.out = 20)
  17. ?seq
  18. seq(from = 1,to = 100,length.out = 19)
  19. rep(1,2)
  20. rep(c(1,2),3)
  21. rep(1:4,2)
  22. rep(1:4,each = 2)
  23. rep(1:4,times = 2)
  24. rep(1:4,times = 1:4)
  25. rep(1:10,times = 1:10)

  26. class(a)
  27. typeof(a)
  28. is.vector(a)
  29. y <- mtcars
  30. is.vector(y)
  31. methods(is)

  32. c <- c('TRUE','FALSE')
  33. is.logical(c)
  34. c <- c(TRUE,FALSE)
  35. c <- c(T,F,F)

  36. x <- c(1,2,3,4,'red') #有一个字符,默认其他数字也是字符
  37. x
  38. typeof(x)
  39. # 向量化操作
  40. a  
  41. a*2  
  42. paste(b,a,sep = "-")  

  43. x <- 1:10
  44. x+1
  45. x*2
  46. x*c(2,-2)
  47. x+c(1,2,3)
  48. 1:9+c(1,2,3)
  49. x <- runif(10000)
  50. x+1
  51. for (i in x) {x <- x+1;print(x)}
  52. system.time(x+1)
  53. # user  system elapsed
  54. # 0       0       0
  55. system.time(for (i in x) {x <- x+1})
  56. # user  system elapsed
  57. # 0.208   0.000   0.208  运算时间明显延长

  58. a <- 1:10
  59. b <- 1:5
  60. a+b
  61. b+a
  62. a*b
  63. b*a

  64. a <- 1:50
  65. b <- c('A','B')
  66. rep(b,each=50)
  67. paste(a,rep(b,each=50),sep = '')
复制代码


4.2 向量索引
  1. #数值索引
  2. rivers[c(1)]
  3. rivers[c(1,10,100)] #R索引从1开始,其他语言一般从0开始
  4. rivers[1:10]
  5. rivers[c(1,2,2,2,2)]
  6. rivers[c(-1)]#去掉第一个值
  7. rivers[c(-1:-10)]
  8. #名称索引
  9. euro
  10. names(euro)
  11. euro[1:3]
  12. euro['DEM']
  13. #逻辑值索引
  14. rivers[TRUE]
  15. rivers[F]
  16. length(rivers)
  17. rivers[seq(1,141,2)]
  18. a <- seq(1,141,2)
  19. rivers[seq(2,141,2)]#rivers[-a]
  20. rivers[c(T,F)]
  21. rivers[c(F,T)]
  22. rivers[c(T,F,F)]
  23. rep(c(T,F),71)[-142]

  24. mean(rivers)
  25. rivers[rivers > mean(rivers)]
  26. rivers[131]
  27. rivers[131] <- 1000 #修改数据
  28. rivers[rivers == 350] <- 1
  29. data('rivers')#恢复数据
  30. rivers[rivers > mean(rivers)] <- 'A'
  31. rivers#变成字符型了
  32. class(rivers)
  33. data('rivers')
  34. rivers[rivers > mean(rivers)] <- 0
  35. rivers[rivers > 0] <- 1
  36. table(rivers)

  37. data('rivers')
  38. rivers[rivers > mean(rivers)]
  39. # rivers[which(rivers > mean(rivers))]
  40. a <- which(rivers > mean(rivers))
  41. rivers[rivers > mean(rivers)] <- 1
  42. rivers
  43. rivers[-a] <- 0
  44. rivers

  45. getwd()
  46. x <- read.csv("homo_length.csv")
  47. x <- head(x,24)
  48. len <- x[,2]
  49. len
  50. class(len)
  51. length(len)
  52. mean(len)
  53. sum(len)
  54. min(len)
  55. max(len)
  56. median(len)
  57. chr <- x[,1]
  58. barplot(len,names.arg = chr,las = 2,col = c('red','green'))
  59. barplot(len,names.arg = chr,las = 2,col = rainbow(4),border = F)
  60. rainbow(4)
复制代码

五、矩阵
       矩阵(Matrix)是一个按照长方阵列排列的复数或实数集合。向量是一维的,而矩阵是二维的,需要有行和列。矩阵是 R 语言中使用较多的一种数据结构,矩阵分为数值矩阵和字符串矩阵,常用的是数据矩阵,基因的表达数据为数值矩阵。矩阵有两大作用,一个是用来计算相关性,另外可以用来绘制热图。
5.1 创建矩阵
  1. #矩阵
  2. getwd()
  3. setwd('/home/xhs/jyxy/11-rbasic/')
  4. state.x77
  5. x <- 1:100
  6. m <- matrix(x,nrow = 25,ncol = 4)
  7. m <- matrix(x,nrow = 25,ncol = 4,byrow = T) #默认是按列排
  8. m
  9. letters
  10. matrix(letters,nrow = 13,byrow = T)
  11. dim(m)
  12. dir()
  13. x <- read.csv('heatmap.csv',row.names = 1)
  14. head(x)
  15. heatmap(x)
  16. # Error in heatmap(x) : 'x' must be a numeric matrix
  17. rowSums(state.x77)
  18. colMeans(state.x77)
  19. cor(state.x77)
  20. class(x)
  21. x <- as.matrix(x)
  22. library(pheatmap)
  23. pheatmap(x)
  24. heatmap(x)
复制代码

5.2 矩阵索引
       矩阵属于二位数据,需要给定行列的。

  1. #矩阵 索引
  2. nrow(x)
  3. ncol(x)
  4. rownames(x)
  5. colnames(x)
  6. class(x)
  7. x[1,2]
  8. x[,2]
  9. class(x[,2])
  10. x[,c(1:5)]
  11. x['ENSG0029','N.GD1']

  12. colnames(x)
  13. y <- x[,c(1:5,11:15,6:10,16:20)]
  14. colnames(y)
  15. y[c(T,F),c(T,F)]

  16. rowSums(x)
  17. rowMeans(x)
  18. colSums(x)
  19. colMeans(x)

  20. x
  21. apply(x, 1, sum)
  22. apply(x, 2, sum)
  23. apply(x, 1, mean)

  24. apply(x, 1, var)
  25. apply(x, 1, sd)
  26. apply(x, 1, max)
  27. apply(x, 1, min)

  28. ?apply
  29. View(state.x77)
  30. sum(state.x77[,1])
  31. apply(state.x77, 2, mean)[2]
复制代码


5.3 利用矩阵绘制热图
      
       利用 pheatmap 绘制热图
       R 非常擅长绘制热图,基础包中的 heatmap()可以直接绘制热图,gplots 包 heatmap.2()也可以绘制热图,pheatmap 包 pheatmap()函数可以绘制更加优雅的热图,ComplexHeatmap包可以绘制复杂的热图。


本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

您需要登录后才可以回帖 登录 | 立即注册

QQ|Archiver|手机版|小黑屋|生信人

GMT+8, 2024-5-4 21:09 , Processed in 0.044459 second(s), 21 queries .

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表