前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >2023.4生信马拉松day3-数据结构

2023.4生信马拉松day3-数据结构

原创
作者头像
清南
发布2023-04-15 18:53:38
1.4K0
发布2023-04-15 18:53:38
举报

回顾:多个数据的组织——数据结构

-向量-

一维数据;

一个向量内部只能有一种数据类型,可以有重复值;

注:重复值允许,不同的数据类型不允许!

-数据框

二维数据;

约等于表格 但是:列有要求(同一列只允许同一种数据类型);不是文件(可以导出来成为一个文件);

数据框单独拿出的一列是向量,视为一个整体;

-矩阵

二维数据;

同一列同一行都只允许一种数据类型;

-列表

什么都可以放;

-class()函数

可以用于判断数据类型/数据结构

本节内容

本节思维导图
本节思维导图

1.数据框来源

-(1)用代码新建

代码语言:txt
复制
df1 <- data.frame(gene   = paste0("gene",1:4),
                 change  = rep(c("up","down"),each = 2),
                 score   = c(5,3,-2,-4))
df1

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

在已有的数据框上进行处理得到;

注:不要把已经读进R的数据框随便放回excel处理,会有雷

——比如excel自助改基因名,例如把“gene MAR”改为“gene三月”

-(3)读取表格文件

代码语言:txt
复制
df2 <- read.csv("gene.csv")
df2
#如果"gene.csv"不在工作目录下会报错,需要:正确打开Rproj设置好工作目录/写明"gene.csv"所在路径;

-(4)R语言内置数据

如 Iris,letters,LETTERS,volcano

代码语言:txt
复制
volcano
heatmap(volcano)   #体验一下用R的内置数据画个图,快乐一下

2.数据框属性

代码语言:txt
复制
dim(df1)  #看行数和列数
nrow(df1)  #只看行数
ncol(df1)   #只看列数
#经常把行列搞反怎么办,跟我念三遍:row是横排成行;colum是纵队为列;
rownames(df1)  #看所有行名
colnames(df1)  #看所有列名

3.数据框取子集

-(1)按列名取列——【最重要】

代码语言:txt
复制
df1$score  #删掉score,按tab键试试:会自动补齐
df1$score
mean(df1$score)   #向量求平均值的做法

-(2)按坐标取元素/行/列

代码语言:txt
复制
df1[2,2]
df1[2,]   #取出来的行会继承数据框属性
df1[,2]    #取出来的列是向量
df1[2]   #不加逗号,可以取出列,并保留其数据框属性
df1[c(1,3),1:2]  #取第一行 第三行的前两个数(会继承行名、列名)

#小tips:读懂error——dimensions

#练习:筛选出向量g中下标为偶数的基因名。
load("gands.Rdata")
seq(from=2,to=100,by=2)
g[seq(2,100,2)]

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

-(3)按名字取子集

代码语言:txt
复制
df1[,"gene"]   #取“gene”那一列
df1[,c('gene','change')]    #取“gene”那一列和“change”那一列

-(4)按条件(逻辑值)取子集【理解!!!】

TRUE对应的行列留下,FALSE对应的行列丢掉;

只关心是什么(TRUE or FALSE),不关心TRUE or FALSE是怎么来的,用c()、比较运算、%in%、某些函数生成均可以,只要与x对应即可,不用非得是由x生成的;

不止要不报错,还要检查是否达到了筛选目的。

代码语言:txt
复制
#例:筛选score > 0的基因
df1$score   #取df1中score那一列,结果为一个含四个元素的向量
df1$score > 0   #运算结果是返回四个逻辑值TRUE/FALSE
df1$score[df1$score > 0]    #把score那一列中TRUE对应的元素取出来,把FALSE对应的元素去掉
df1[df1$score > 0,1]        #把df1中score > 0的行取出来
df1[c(T,T,F,F),1]        #把df1中TRUE对应的行取出来,与上一行效果一样
df1$gene[df1$score > 0]  #把score > 0的基因取出来

#练习:向量 g 中有多少个元素在向量 s 中存在(要求用函数计算出具体个数)?将这些元素筛选出来。
table(g %in% s)
length(intersect(g,s))    # %in%不会去重复,有多少是多少,取交集取并集会去重复;
g[g %in% s]   #筛选在s中存在的所有g

#练习:生成10个随机数: rnorm(n=10,mean=0,sd=18),用向量取子集的方法,取出其中小于-2的值:
z=rnorm(n=10,mean=0,sd=18)
z
z[z < -2]  #不空格的话就会变成 <- 赋值

练习题3-1:

代码语言:txt
复制
# 1.读取exercise.csv这个文件,赋值给test。
test = read.csv("exercise.csv")
test
# 2.求test第一列数值的中位数
median(test[,1])
median(test$Petal.Length)
# 3.筛选test中,Species列的值为a或c的行
test[test$Species %in% c("a","c"),]  
#如果把这里的%in%换成 == 的话会出现循环补齐,是不对滴;
#上次已经辨析过:x == y和x %in% y的区别:前者是x和y对应位置一对一比较,是等位运算;后者是x每一个元素都要和y里所有的元素比一遍;

4.数据框修改

代码语言:txt
复制
#改一个格
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"

5.两个数据框的连接

是excel做不到的功能——

代码语言:txt
复制
#先创建三个数据框
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")

6.矩阵

代码语言:txt
复制
#新建矩阵
m <- matrix(1:9, nrow = 3)
#加列名
colnames(m) <- c("a","b","c") 
m
#取m的子集——注意矩阵中不能使用$进行取子集
m[2,]
m[,1]
m[2,3]
m[2:3,1:2]

#矩阵的转置和转换
m
t(m)
as.data.frame(m)    
class(m)    #看着是把m变成了数据框,但是没有赋值就没有发生过;要m=as.data.frame(m)之后才能真的把m变成数据框

#用矩阵画热图
pheatmap::pheatmap(m)    #默认设置-把相似的行和相似的列聚类
pheatmap::pheatmap(m,cluster_cols = F, cluster_rows = F)

7.列表

代码语言:txt
复制
#用list()函数生成list
l <- list(m1 = matrix(1:9, nrow = 3),
          m2 = matrix(2:9, nrow = 2))
l

#列表取子集,直接取出来的元素是列表
l$m1

8.补充知识

代码语言:txt
复制
# 元素的名字
scores = c(100,59,73,95,45)
names(scores) = c("jimmy","nicker","Damon","Sophie","tony")
scores
#按名字取元素出来
scores["jimmy"]
scores[c("jimmy","nicker")]
#按逻辑值取——名字和元素对应之后可以按名字判断
names(scores)[scores>60]
代码语言:txt
复制
# 删除 
rm(l)   #删除1个
rm(df1,df2)  #删除多个用 逗号隔开
rm(list = ls())   #删除全部——用ls列出所有东西,然后把他们都删掉;等价于清空控制台,快捷键ctrl+l

小结

引用自生信技能树-小洁老师
引用自生信技能树-小洁老师

-练习3-2

代码语言:txt
复制
# 1.统计内置数据iris最后一列有哪几个取值,每个取值重复了多少次
table(iris[,ncol(iris)])
# 2.提取内置数据iris的前5行,前4列,并转换为矩阵,赋值给a。
iris[1:5,1:4]
a=as.matrix(iris[1:5,1:4])
a
# 3.将a的行名改为flower1,flower2...flower5。
paste0("flower",1:5)
rownames(a) <- paste0("flower",1:nrow(a))
a
# 4.探索列表取子集l[2]和l[[2]]的区别(提示:数据结构)
l[2]    
l [[2]]   
class(l[2])  #是列表
class(l[[2]])  #是矩阵

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

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

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

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

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 回顾:多个数据的组织——数据结构
    • -向量-
      • -数据框
        • -矩阵
          • -列表
            • -class()函数
            • 本节内容
              • 1.数据框来源
                • -(1)用代码新建
                • -(2)由已有数据转换或处理得到
                • -(3)读取表格文件
                • -(4)R语言内置数据
              • 2.数据框属性
                • 3.数据框取子集
                  • -(1)按列名取列——【最重要】
                  • -(2)按坐标取元素/行/列
                  • -(3)按名字取子集
                  • -(4)按条件(逻辑值)取子集【理解!!!】
                  • 练习题3-1:
                • 4.数据框修改
                  • 5.两个数据框的连接
                    • 6.矩阵
                      • 7.列表
                        • 8.补充知识
                          • 小结
                            • -练习3-2
                        领券
                        问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档