谢大飞

V1

2023/05/17阅读:9主题:默认主题

R语言数据结构

数据结构

R语言中数据结构可以理解为一种储存数据的方式。数据结构包括向量、矩阵、数组、因子、列表和数据框。——《R语言数据分析与可视化 从入门到精通》

多个数据
多个数据

向量比较重要,所以单独整理了一篇向量_R语言,今天整理一下剩余的几种数据结构——矩阵、列表和数据框

矩阵和数组

矩阵是数组的一种特殊情况,是二维数组,其中矩阵和数组中所有元素要求必须是相同类型的数据

1. 创建矩阵

可以通过函数来创建,使用matrix()来创建矩阵,array()函数用来创建数组

#创建矩阵
> x <- matrix(1:16,nrow = 4, ncol = 4)
> x
     [,1] [,2] [,3] [,4]
[1,]    1    5    9   13
[2,]    2    6   10   14
[3,]    3    7   11   15
[4,]    4    8   12   16

#创建数组(三维或以上)
> y <- array(letters[1:24],dim = c(4,3,2))
> y
, , 1

     [,1] [,2] [,3]
[1,] "a"  "e"  "i" 
[2,] "b"  "f"  "j" 
[3,] "c"  "g"  "k" 
[4,] "d"  "h"  "l" 

, , 2

     [,1] [,2] [,3]
[1,] "m"  "q"  "u" 
[2,] "n"  "r"  "v" 
[3,] "o"  "s"  "w" 
[4,] "p"  "t"  "x" 

dim()函数可以以向量的形式展示矩阵和数组中各维度的长度

> dim(x)
[1] 4 4
> dim(y)
[1] 4 3 2

2. 命名

可以使用rownames() 对行进行命名,colnames() 函数对数组的列进行命名,而dimnames() 函数对数组的各个维度依次进行命名

y <- array(letters[1:24],dim = c(4,3,2))
y

rownames(y) <- c("roe1","roe2","roe3","roe4")
colnames(y) <- c("col1","col2","col3")
y

dimnames(y) <- list(c("roe1","roe2","roe3","roe4"),
                    c("col1","col2","col3"),
                    c("list1","list2"))
y

对数组进行命名
对数组进行命名

3. 提取矩阵或数组子集

与向量类似,使用方括号[]来提取矩阵的子集,通过在方括号中使用正负整数、逻辑值或者元素名称等方式来提取需要的子集

#通过正负整数取
> y[c(2,3),2,1]
roe2 roe3 
 "f"  "g" 
> y[c(-2,-3),2,2]
roe1 roe4 
 "q"  "t" 
 
#通过逻辑值取
> y[c(2,3),c(FALSE,TRUE,FALSE),c(TRUE,FALSE)]
roe2 roe3 
 "f"  "g" 

#通过元素名称取
> y[c("roe1","roe3"),3,1]
roe1 roe3 
 "i"  "k" 

list列表:可装万物

列表是一个有各种对戏那个的有序集合构成的对象。R语言中很多函数的输出结果都是列表的形式。——《R语言数据分析与可视化 从入门到精通》

列表
列表

列表中包含的对象称为分量,分量可以是不同的数据类型。一个列表同时可以包含数值向量、逻辑向量、矩阵、复数向量、字符数组等。所以小洁老师说list列表:可装万物

1. 创建列表

通过list()函数来创建

> l <- list("R","E","F",TRUE,100)
> l
[[1]]
[1] "R"

[[2]]
[1] "E"

[[3]]
[1] "F"

[[4]]
[1] TRUE

[[5]]
[1] 100

2. 列表命名

可以在创建列表之后给分量指定名称,也可以在创建时就给每个分量进行命名,但列表的标签并不是必须的

> names(l) <- c("字母","字母","字母","是否合格","加个")
> l
$字母
[1] "R"

$字母
[1] "E"

$字母
[1] "F"

$是否合格
[1] TRUE

$加个
[1] 100

3. 提取列表子集

可以使用方括号[]、双层方括号[[]],或者美元符号$来提取

  1. 其中使用方括号提取时,可以使用逻辑值或者字符来提取指定的子集,得到的结果也会是列表;
  2. 当使用双层方括号[[]]来提取时,一次只能提取一个分量,得到的结果是分量本身的数据结构;
  3. 当使用美元符号来提取时,则需要列表的分量已经进行命名。
> l[1]
$字母
[1] "R"

> l[[2]]
[1] "E"

> l$字母
[1] "R"

数据框

数据框结构与矩阵结构类似,有行和列的两个维度。不同之处在于数据框要求每一列中间数据格式一致,但列与列之间的数据类型可以不同

数据框与矩阵区别
数据框与矩阵区别

数据框小洁老师讲解的非常详细,那我就斗胆直接附上啦!PS:下面代码和注释全部来自小洁老师数据挖掘课程

1.数据框来源

(1)用代码新建

(2)由已有数据转换或处理得到

(3)读取表格文件

(4)R语言内置数据

2.新建和读取数据框

可以通过data.frame()函数创建数据框,也可以使用read.csv()函数读取我们本地的数据

如果需要将其他数据格式转换为数据框的话,可以通过as.data.frame()函数来实现

df1 <- data.frame(gene   = paste0("gene",1:4),
                 change  = rep(c("up","down"),each = 2),
                 score   = c(5,3,-2,-4))
df1

df2 <- read.csv("gene.csv")
df2
新建和读取数据框
新建和读取数据框

3.数据框属性

数据框属性主要包括行数列数以及行名和列名,可以通过函数确认

#行数列数以及行名和列名
dim(df1)
nrow(df1)
ncol(df1)

#行名和列名
rownames(df1)
colnames(df1)
数据框属性
数据框属性

4.数据框取子集

df1$gene  #删掉score,按tab键试试
mean(df1$score)

## 按坐标
df1[2,2]
df1[2,]
df1[,2]
df1[c(1,3),1:2]
## 按名字
df1[,"gene"]
df1[,c('gene','change')]
## 按条件(逻辑值)
df1[df1$score>0,]

## 代码思维
#如何取数据框的最后一列?
df1[,3]
df1[,ncol(df1)]  #计算最后一列

#如何取数据框除了最后一列以外的其他列?
df1[,-ncol(df1)]

#筛选score > 0的基因
df1[df1$score > 0,1]
df1$gene[df1$score > 0]
数据框取子集
数据框取子集

5.数据框修改

#改一个格
df1[3,3] <- 5
df1
#改一整列
df1$score <- c(12,23,50,2)     
df1

df1$p.value <- c(0.01,0.02,0.07,0.05) 
df1

#改行名和列名
rownames(df1) <- c("r1","r2","r3","r4")
#只修改某一行/列的名
colnames(df1)[2] <- "CHANGE"

6.两个数据框的连接

可以通过相同的列进行链接

test1 <- data.frame(name = c('jimmy','nicker','Damon','Sophie'), 
                    blood_type = c("A","B","O","AB"))
test1
test2 <- data.frame(name = c('Damon','jimmy','nicker','tony'),
                    group = c("group1","group1","group2","group2"),
                    vision = c(4.2,4.3,4.9,4.5))
test2

test3 <- data.frame(NAME = c('Damon','jimmy','nicker','tony'),
                    weight = c(140,145,110,138))
test3
merge(test1,test2,by="name")
merge(test1,test3,by.x = "name",by.y = "NAME")
数据框链接
数据框链接

写在最后

最近跟着**生信技能树的数据挖掘马拉松的课程** 在系统学习R语言相关知识,并且在整理R语言相关的合集,争取毕业旅行之前学会R

生信入门&数据挖掘
生信入门&数据挖掘

分类:

后端

标签:

数据结构与算法

作者介绍

谢大飞
V1