前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >R语言基础-向量、矩阵、数据框、列表相关操作

R语言基础-向量、矩阵、数据框、列表相关操作

原创
作者头像
生信汪一昂
发布2023-09-16 14:28:53
3050
发布2023-09-16 14:28:53
举报
文章被收录于专栏:生信学习之路生信学习之路

2.6 简单向量作图

代码语言:text
复制
k1 = rnorm(12);k1 #随便取12个随机数,然后输出k1
代码语言:txt
复制
##  [1]  0.41853982  0.88210309 -0.06783763 -2.05692258 -0.39985487
##  [6]  0.10934353  2.68202894 -0.65648836  0.71392053 -0.70968398
## [11] -0.69575682  0.42798879
代码语言:text
复制
plot(k1) #这样就能做一个纵坐标值为k1,横坐标为个数的点图啦,因为取了12个随机数,所以这边横坐标为12
代码语言:text
复制
k2 = rep(c("a","b","c","d"),each = 3);k2 #这边把times换成了each,同作为rep()的形式参数,在功能上稍微有些区别,大家分别跑一遍就知道了。在此简单说明:times-将整个向量中所有元素视作整体,重复三次;each则是将指定向量中,每一个元素按顺序进行重复指定次数(这边为3)
代码语言:txt
复制
##  [1] "a" "a" "a" "b" "b" "b" "c" "c" "c" "d" "d" "d"
代码语言:text
复制
boxplot(k1~k2) #这要一张简单的箱线图就做出来了
代码语言:text
复制
#说下怎么看,纵坐标k1的12个值,横坐标同样是12(a、a、a、b、b、b、……)
#这边以a为例。三个a分别对应了k1,12个随机数中的前三个值,那条线是三个值的中位数(不是平均值哦)

3.向量、数据框、矩阵、列表

代码语言:text
复制
#先简单介绍下这些名字吧。
# 1.向量是组成数据框以及矩阵的基本单位。
c(1,2,3,4,5)
代码语言:txt
复制
## [1] 1 2 3 4 5
代码语言:text
复制
# 2.矩阵在一定程度上可以看作是只有一种数据类型的特殊数据框,通常来说数据类型只有数字类型。
#简单构建一个
Matrix1 = 1:12
dim(Matrix1) = c(3,4) #构建维度,后面会详细写哦
Matrix1
代码语言:txt
复制
##      [,1] [,2] [,3] [,4]
## [1,]    1    4    7   10
## [2,]    2    5    8   11
## [3,]    3    6    9   12
代码语言:text
复制
# 3.数据框-一定程度上可以理解为我们常见的excel表格,但又不完全是。这部分内容较为重要,因此笔墨会偏多一些。

3.1 数据框来源

代码语言:text
复制
# (1)用代码新建
# (2)由已有数据转换或处理得到
# (3)读取表格文件
# (4)R语言内置数据

3.1.1 新建和读取数据框

代码语言:text
复制
df1 <- data.frame(gene   = paste0("gene",1:4),
                 change  = rep(c("up","down"),each = 2),
                 score   = c(5,3,-2,-4))
df1
代码语言:txt
复制
##    gene change score
## 1 gene1     up     5
## 2 gene2     up     3
## 3 gene3   down    -2
## 4 gene4   down    -4
代码语言:text
复制
#很明显df1可以看作是由三个向量组成的数据框-两个字符型‘gene’,‘change’以及一个数字型‘score’。代码排版的话,大家跟着敲一遍就明白了。
#数据框可以由不同数据类型的向量组成,但矩阵不行。

3.1.2 从文件中读取

代码语言:text
复制
df2 = read.csv("gene.csv")
代码语言:txt
复制
## Warning in file(file, "rt"): cannot open file 'gene.csv': No such file
## or directory
代码语言:txt
复制
## Error in file(file, "rt"): cannot open the connection
代码语言:text
复制
df2
代码语言:txt
复制
## Error in eval(expr, envir, enclos): object 'df2' not found
代码语言:text
复制
#代码肯定没问题,但运行起来会报错:No such file or directory
#报错的原因是因为这个文件此时并不在我的工作目录下,即这个文件和为了写这篇笔记而创造的Rproj文件不在同一个地方。
#因此后续操作,依旧以df1为例

3.1.3 数据框属性

代码语言:text
复制
#查看纬度(几行、几列)
dim(df1)
代码语言:txt
复制
## [1] 4 3
代码语言:text
复制
#查看行数、列数
nrow(df1)
代码语言:txt
复制
## [1] 4
代码语言:text
复制
ncol(df1)
代码语言:txt
复制
## [1] 3
代码语言:text
复制
#查看行名、列名
rownames(df1)
代码语言:txt
复制
## [1] "1" "2" "3" "4"
代码语言:text
复制
colnames(df1)
代码语言:txt
复制
## [1] "gene"   "change" "score"

3.1.4 数据框取子集 (重点!)

代码语言:text
复制
# 1.用‘数据框’$+tab
#如果没反应就手动敲一下列名,然后删掉再tab。
df1$score #代码的意思是:df1这个数据框中取score那列。
代码语言:txt
复制
## [1]  5  3 -2 -4
代码语言:text
复制
mean(df1$score) 
代码语言:txt
复制
## [1] 0.5
代码语言:text
复制
#其中score就是那列数值型向量的名字,由于其存在于数据框df1当中,所以名字就变成了df1$score。df1$score的本质就是一个数值型向量,因此拿来做数学运算当然没问题啦。

# 2.用坐标
df1[2,2] #取数据框中第2行、第2列
代码语言:txt
复制
## [1] "up"
代码语言:text
复制
df1[2,] #取数据框中第2行,由于取行会保留数据框的一部分属性,因此行名和列名会反馈给你。
代码语言:txt
复制
##    gene change score
## 2 gene2     up     3
代码语言:text
复制
df1[,2] #取列的话就是取向量,因此不会出现和行一样的情况
代码语言:txt
复制
## [1] "up"   "up"   "down" "down"
代码语言:text
复制
df1[c(1,3),1:2]#灵活一些,分别取第1行第1列以及第3行第2列两个元素
代码语言:txt
复制
##    gene change
## 1 gene1     up
## 3 gene3   down
代码语言:text
复制
# 3.按名字
df1[,'gene']
代码语言:txt
复制
## [1] "gene1" "gene2" "gene3" "gene4"
代码语言:text
复制
#也可以是一个名字集合
df1[,c('gene','change')]
代码语言:txt
复制
##    gene change
## 1 gene1     up
## 2 gene2     up
## 3 gene3   down
## 4 gene4   down
代码语言:text
复制
# 4.按照逻辑值取子集
df1[df1$score>0,] #df1$score这个整体可以看作是一个数值型向量,可理解为取df1数据框中score>0的那两行。
代码语言:txt
复制
##    gene change score
## 1 gene1     up     5
## 2 gene2     up     3
代码语言:text
复制
#知道原理后就可以灵活一些咯,下面两条代码的结果是一样的哦
df1[df1$score>0,1]
代码语言:txt
复制
## [1] "gene1" "gene2"
代码语言:text
复制
df1$gene[df1$score>0]
代码语言:txt
复制
## [1] "gene1" "gene2"
代码语言:text
复制
#拓展:如何取数据框最后一列呢?
df1[,ncol(df1)]
代码语言:txt
复制
## [1]  5  3 -2 -4
代码语言:text
复制
#除了最后一列都要呢
df1[,-ncol(df1)]
代码语言:txt
复制
##    gene change
## 1 gene1     up
## 2 gene2     up
## 3 gene3   down
## 4 gene4   down

3.1.5 数据框修改

代码语言:text
复制
#一般来说原始数据不做任何改动,防止操作失误引起数据造假哦
#改一个格
df1[3,3] = 5
df1
代码语言:txt
复制
##    gene change score
## 1 gene1     up     5
## 2 gene2     up     3
## 3 gene3   down     5
## 4 gene4   down    -4
代码语言:text
复制
#改一整列
df1$score = c(12,23,50,2)
df1
代码语言:txt
复制
##    gene change score
## 1 gene1     up    12
## 2 gene2     up    23
## 3 gene3   down    50
## 4 gene4   down     2
代码语言:text
复制
#原来数据框没有,则可以通过这个操作增加一列哦
df1$p.value = c(0.01,0.02,0.07,0.05)
df1
代码语言:txt
复制
##    gene change score p.value
## 1 gene1     up    12    0.01
## 2 gene2     up    23    0.02
## 3 gene3   down    50    0.07
## 4 gene4   down     2    0.05
代码语言:text
复制
#修改行名,列名
rownames(df1) = c('r1','r2','r3','r4')
colnames(df1)[2] = 'CHANGE' 

3.1.6 两个数据框的链接

代码语言:text
复制
#随便建两个数据框
test1 <- data.frame(name = c('jimmy','nicker','Damon','Sophie'), 
                    blood_type = c("A","B","O","AB"))
test1
代码语言:txt
复制
##     name blood_type
## 1  jimmy          A
## 2 nicker          B
## 3  Damon          O
## 4 Sophie         AB
代码语言:text
复制
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
代码语言:txt
复制
##     name  group vision
## 1  Damon group1    4.2
## 2  jimmy group1    4.3
## 3 nicker group2    4.9
## 4   tony group2    4.5
代码语言:text
复制
#很容易发现名字的顺序是一定区别的,此时我们可以通过merge函数进行智能连接
merge(test1,test2,by='name')
代码语言:txt
复制
##     name blood_type  group vision
## 1  Damon          O group1    4.2
## 2  jimmy          A group1    4.3
## 3 nicker          B group2    4.9
代码语言:text
复制
#在新建一个列名‘NAME’稍微有些区别的数据框
test3 <- data.frame(NAME = c('Damon','jimmy','nicker','tony'),
                    weight = c(140,145,110,138))
test3
代码语言:txt
复制
##     NAME weight
## 1  Damon    140
## 2  jimmy    145
## 3 nicker    110
## 4   tony    138
代码语言:text
复制
#依旧可以用merge函数进行智能连接
merge(test1,test2,by.x = 'name',by.y = 'NAME')
代码语言:txt
复制
## Error in fix.by(by.y, y): 'by' must specify a uniquely valid column

3.2矩阵

3.2.1 矩阵新建和取子集

代码语言:text
复制
#其实和数据框差不多,但其不支持$,这边简单写几个代码吧
m = matrix(1:9,nrow = 3)
m
代码语言:txt
复制
##      [,1] [,2] [,3]
## [1,]    1    4    7
## [2,]    2    5    8
## [3,]    3    6    9
代码语言:text
复制
m[2,]
代码语言:txt
复制
## [1] 2 5 8
代码语言:text
复制
m[,1]
代码语言:txt
复制
## [1] 1 2 3
代码语言:text
复制
m[2,3]
代码语言:txt
复制
## [1] 8
代码语言:text
复制
m[2:3,1:2]
代码语言:txt
复制
##      [,1] [,2]
## [1,]    2    5
## [2,]    3    6

3.2.2 矩阵转置和转换

代码语言:text
复制
colnames(m) = c('a','b','c')
m
代码语言:txt
复制
##      a b c
## [1,] 1 4 7
## [2,] 2 5 8
## [3,] 3 6 9
代码语言:text
复制
#转置
t(m)
代码语言:txt
复制
##   [,1] [,2] [,3]
## a    1    2    3
## b    4    5    6
## c    7    8    9
代码语言:text
复制
#转换为数据框,记得赋值后再去class哦
as.data.frame(m)
代码语言:txt
复制
##   a b c
## 1 1 4 7
## 2 2 5 8
## 3 3 6 9
代码语言:text
复制
#随便画个热图pheatmap::pheatmap()
pheatmap::pheatmap(m)

3.3 列表

3.3.1 列表新建和取子集

代码语言:text
复制
#简单了解下吧
x = list(m1 = matrix(1:9,norw = 3),
         m2 = matrix(2:9,nrow = 2))
代码语言:txt
复制
## Error in matrix(1:9, norw = 3): unused argument (norw = 3)
代码语言:text
复制
x
代码语言:txt
复制
## Error in eval(expr, envir, enclos): object 'x' not found

3.4 补充:元素的“名字”-names()

代码语言:text
复制
#随便新建一个变量
scores = c(100,59,73,95,45)
#给变量中的每个元素起个名字
names(scores) = c('jimmy','nicker','Damon','sophie','tony')
#输出变量
scores
代码语言:txt
复制
##  jimmy nicker  Damon sophie   tony 
##    100     59     73     95     45
代码语言:text
复制
#还可以这么输出哦
scores['jimmy']
代码语言:txt
复制
## jimmy 
##   100
代码语言:text
复制
scores[c('jimmy','nicker')]
代码语言:txt
复制
##  jimmy nicker 
##    100     59
代码语言:text
复制
scores[scores > 60]
代码语言:txt
复制
##  jimmy  Damon sophie 
##    100     73     95

3.5 补充:删除变量

代码语言:text
复制
#删除一个
rm(df1)
#删除多个
rm(k1,k2)
#删除全部
rm(list = ls())
#清空控制台
control + l
代码语言:txt
复制
## Error in eval(expr, envir, enclos): object 'control' not found
代码语言:text
复制
#就以这部分收尾吧。

引用自生信技能树

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 2.6 简单向量作图
  • 3.向量、数据框、矩阵、列表
    • 3.1 数据框来源
      • 3.1.1 新建和读取数据框
      • 3.1.2 从文件中读取
      • 3.1.3 数据框属性
      • 3.1.4 数据框取子集 (重点!)
      • 3.1.5 数据框修改
      • 3.1.6 两个数据框的链接
    • 3.2矩阵
      • 3.2.1 矩阵新建和取子集
      • 3.2.2 矩阵转置和转换
    • 3.3 列表
      • 3.3.1 列表新建和取子集
    • 3.4 补充:元素的“名字”-names()
      • 3.5 补充:删除变量
      领券
      问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档