认识向量

2022-10-25 19:45:40 浏览数 (2)

背景

在使用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

有些板块也可以预设为大家日常趣事的分享等,欢迎大家来提建议。

0 人点赞