背景
在使用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 之后,默认已经加载了 datasets 包,里面包含了大量数据集,使用 data()函数可以显示所有数据集。直接敲数据集的名字就能够打印出数据集的内容,内置数据集与自己通过文件将数据读入 R 中,存储为变量效果上是一样的。
代码语言:javascript复制# 显示所有内置数据集
data()
#加载扩展包数据集
data(package = "MASS")
data(package = "ggplot2")
四、向量
向量:vector,是 R 中最重要的一个概念,它是构成其他数据结构的基础。向量其实是用于存储数值型、字符型或逻辑型数据的一维数组。R 中的向量与解析几何或者物理学中有数值和方向的量不同,R 中的向量是一个集合,即可以是数值的集合也可以是字符串或者逻辑值的集合。其余数据结构都由向量构成。
4.1 创建向量
用函数c来创建向量。c代表concatenate连接,也可以理解为收集collect,或者合并combine。新手经常犯的错误就是忘了使用 c()函数。
代码语言:javascript复制#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 向量索引
代码语言:javascript复制#数值索引
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 创建矩阵
代码语言:javascript复制#矩阵
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 矩阵索引
矩阵属于二位数据,需要给定行列的。
代码语言:javascript复制#矩阵 索引
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包可以绘制复杂的热图。
写在最后:有时间我们会努力更新的。大家互动交流可以前去论坛,地址在下面,复制去浏览器即可访问,弥补下公众号没有留言功能的缺憾。原地址暂未启用(bioinfoer.com)。
代码语言:javascript复制sx.voiceclouds.cn
有些板块也可以预设为大家日常趣事的分享等,欢迎大家来提建议。