|
发表于 2022-8-10 12:54:33
|
查看: 1001 |
回复: 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 中,存储为变量效果上是一样的。
- # 显示所有内置数据集
- data()
- #加载扩展包数据集
- data(package = "MASS")
- data(package = "ggplot2")
复制代码
四、向量
向量:vector,是 R 中最重要的一个概念,它是构成其他数据结构的基础。向量其实是用于存储数值型、字符型或逻辑型数据的一维数组。R 中的向量与解析几何或者物理学中有数值和方向的量不同,R 中的向量是一个集合,即可以是数值的集合也可以是字符串或者逻辑值的集合。其余数据结构都由向量构成。
4.1 创建向量
用函数c来创建向量。c代表concatenate连接,也可以理解为收集collect,或者合并combine。新手经常犯的错误就是忘了使用 c()函数。
- #R 内置向量
- rivers
- euro
- plot(rivers)
- hist(rivers)
- names(euro)
- length(euro)
- a <- c(1,2,3)
- #字符型向量
- b <- c("red","green","blue")
- #生成连续型向量
- c <- seq(1,100,2)
- d <- rep(c(1,2),5)
- seq(1,100,2)
- seq(from = 1,to = 100,by = 3)
- seq(from = 1,to = 100,length.out = 20)
- ?seq
- seq(from = 1,to = 100,length.out = 19)
- rep(1,2)
- rep(c(1,2),3)
- rep(1:4,2)
- rep(1:4,each = 2)
- rep(1:4,times = 2)
- rep(1:4,times = 1:4)
- rep(1:10,times = 1:10)
- class(a)
- typeof(a)
- is.vector(a)
- y <- mtcars
- is.vector(y)
- methods(is)
- c <- c('TRUE','FALSE')
- is.logical(c)
- c <- c(TRUE,FALSE)
- c <- c(T,F,F)
- x <- c(1,2,3,4,'red') #有一个字符,默认其他数字也是字符
- x
- typeof(x)
- # 向量化操作
- a
- a*2
- paste(b,a,sep = "-")
- x <- 1:10
- x+1
- x*2
- x*c(2,-2)
- x+c(1,2,3)
- 1:9+c(1,2,3)
- x <- runif(10000)
- x+1
- for (i in x) {x <- x+1;print(x)}
- system.time(x+1)
- # user system elapsed
- # 0 0 0
- system.time(for (i in x) {x <- x+1})
- # user system elapsed
- # 0.208 0.000 0.208 运算时间明显延长
- a <- 1:10
- b <- 1:5
- a+b
- b+a
- a*b
- b*a
- a <- 1:50
- b <- c('A','B')
- rep(b,each=50)
- paste(a,rep(b,each=50),sep = '')
复制代码
4.2 向量索引
- #数值索引
- rivers[c(1)]
- rivers[c(1,10,100)] #R索引从1开始,其他语言一般从0开始
- rivers[1:10]
- rivers[c(1,2,2,2,2)]
- rivers[c(-1)]#去掉第一个值
- rivers[c(-1:-10)]
- #名称索引
- euro
- names(euro)
- euro[1:3]
- euro['DEM']
- #逻辑值索引
- rivers[TRUE]
- rivers[F]
- length(rivers)
- rivers[seq(1,141,2)]
- a <- seq(1,141,2)
- rivers[seq(2,141,2)]#rivers[-a]
- rivers[c(T,F)]
- rivers[c(F,T)]
- rivers[c(T,F,F)]
- rep(c(T,F),71)[-142]
- mean(rivers)
- rivers[rivers > mean(rivers)]
- rivers[131]
- rivers[131] <- 1000 #修改数据
- rivers[rivers == 350] <- 1
- data('rivers')#恢复数据
- rivers[rivers > mean(rivers)] <- 'A'
- rivers#变成字符型了
- class(rivers)
- data('rivers')
- rivers[rivers > mean(rivers)] <- 0
- rivers[rivers > 0] <- 1
- table(rivers)
- data('rivers')
- rivers[rivers > mean(rivers)]
- # rivers[which(rivers > mean(rivers))]
- a <- which(rivers > mean(rivers))
- rivers[rivers > mean(rivers)] <- 1
- rivers
- rivers[-a] <- 0
- rivers
- getwd()
- x <- read.csv("homo_length.csv")
- x <- head(x,24)
- len <- x[,2]
- len
- class(len)
- length(len)
- mean(len)
- sum(len)
- min(len)
- max(len)
- median(len)
- chr <- x[,1]
- barplot(len,names.arg = chr,las = 2,col = c('red','green'))
- barplot(len,names.arg = chr,las = 2,col = rainbow(4),border = F)
- rainbow(4)
复制代码
五、矩阵
矩阵(Matrix)是一个按照长方阵列排列的复数或实数集合。向量是一维的,而矩阵是二维的,需要有行和列。矩阵是 R 语言中使用较多的一种数据结构,矩阵分为数值矩阵和字符串矩阵,常用的是数据矩阵,基因的表达数据为数值矩阵。矩阵有两大作用,一个是用来计算相关性,另外可以用来绘制热图。
5.1 创建矩阵- #矩阵
- getwd()
- setwd('/home/xhs/jyxy/11-rbasic/')
- state.x77
- x <- 1:100
- m <- matrix(x,nrow = 25,ncol = 4)
- m <- matrix(x,nrow = 25,ncol = 4,byrow = T) #默认是按列排
- m
- letters
- matrix(letters,nrow = 13,byrow = T)
- dim(m)
- dir()
- x <- read.csv('heatmap.csv',row.names = 1)
- head(x)
- heatmap(x)
- # Error in heatmap(x) : 'x' must be a numeric matrix
- rowSums(state.x77)
- colMeans(state.x77)
- cor(state.x77)
- class(x)
- x <- as.matrix(x)
- library(pheatmap)
- pheatmap(x)
- heatmap(x)
复制代码
5.2 矩阵索引
矩阵属于二位数据,需要给定行列的。
- #矩阵 索引
- nrow(x)
- ncol(x)
- rownames(x)
- colnames(x)
- class(x)
- x[1,2]
- x[,2]
- class(x[,2])
- x[,c(1:5)]
- x['ENSG0029','N.GD1']
- colnames(x)
- y <- x[,c(1:5,11:15,6:10,16:20)]
- colnames(y)
- y[c(T,F),c(T,F)]
- rowSums(x)
- rowMeans(x)
- colSums(x)
- colMeans(x)
- x
- apply(x, 1, sum)
- apply(x, 2, sum)
- apply(x, 1, mean)
- apply(x, 1, var)
- apply(x, 1, sd)
- apply(x, 1, max)
- apply(x, 1, min)
- ?apply
- View(state.x77)
- sum(state.x77[,1])
- apply(state.x77, 2, mean)[2]
复制代码
5.3 利用矩阵绘制热图
利用 pheatmap 绘制热图
R 非常擅长绘制热图,基础包中的 heatmap()可以直接绘制热图,gplots 包 heatmap.2()也可以绘制热图,pheatmap 包 pheatmap()函数可以绘制更加优雅的热图,ComplexHeatmap包可以绘制复杂的热图。
|
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有账号?立即注册
|