生信技能树2021生信入门线上课笔记,需要结合课程讲解服用
数据结构
1)向量-一个维度
> x=sample(1:100,28)
> x
[1] 46 59 43 10 18 61 95 72 92 32 52 5 49 9 12 20
[17] 7 54 34 23 80 58 66 67 88 26 76 44
2)矩阵-两个维度,里面的向量要长度相同,数据类型相同
> matrix(x,nrow=7)#byrow按行排
[,1] [,2] [,3] [,4]
[1,] 46 72 12 58
[2,] 59 92 20 66
[3,] 43 32 7 67
[4,] 10 52 54 88
[5,] 18 5 34 26
[6,] 61 49 23 76
[7,] 95 9 80 44
3)数据框-二维,长度相同、数据类型可以不同的向量按列组合(作图时常用的数据类型)
> y1=letters[1:7]
> y2=sample(1:100,7)
> y3=sample(1:10,7)
> data.frame(y1,y2,y3)
y1 y2 y3
1 a 32 2
2 b 13 5
3 c 8 9
4 d 46 1
5 e 1 4
6 f 95 8
7 g 76 3
> a = 1:30
> a
[1] 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
[17] 17 18 19 20 21 22 23 24 25 26 27 28 29 30
> dim(a) = c(5,6)#将向量转化为数据框,添加维度
> a
[,1] [,2] [,3] [,4] [,5] [,6]
[1,] 1 6 11 16 21 26
[2,] 2 7 12 17 22 27
[3,] 3 8 13 18 23 28
[4,] 4 9 14 19 24 29
[5,] 5 10 15 20 25 30
4)列表-长度可以不同,数据类型可以不同,没有行列的概念,可以有多级元素,列表可以无限嵌套
1.随机抽样
sample(1:100,7) #从1到100中随机抽取7个,无放回
[1] 51 53 57 21 60 84 41
> sample(1:60,61,replace = T)#放回
[1] 22 2 38 34 29 57 44 5 37 51 23 26 7 32 58 21
[17] 55 30 38 28 6 28 38 22 44 41 25 9 35 34 7 24
[33] 29 19 17 56 11 39 10 44 22 23 52 46 36 20 21 19
[49] 36 40 24 29 44 12 59 43 29 32 56 41 57
> set.seed(100)#让模拟结果能够可重复出现
> sample(1:60,6,replace = T)
[1] 10 55 38 48 51 25
rm(list = ls())#清空环境
options(stringsAsFactors = F)#避免把数据框里的数据类型转化为因子
3.数据框来源
(1)在R中新建(本质是向量按列组合)
(2)由已有数据转换或处理得到
(3)从文件中读取
df2 <- read.csv("gene.csv")
df2
(4)内置数据集(不需要赋值也可以使用的变量)
4.数据框属性描述
dim(df)#几行几列
nrow(df)#行数
ncol(df)#列数
rownames(df)
colnames(df)
head(df)#默认取6行
head(df,3)#看前3行
df[1:3,1:3]#看前3行前3列;不经过赋值,就只是输出看看
> class(iris[1])#取第一列,仍为数据框
[1] "data.frame"
str(df)#查看每一列的数据类型和具体内容
na.omit(df)#删除含有缺失值的行
5.数据框取子集(左边是行,右边是列,哪边空着就哪边全选;中括号里的逗号表示维度的分割)
df[2,2]
df[2,]
df[,2]
df[c(1,3),1:2]
#根据‘名字’提取自己
df[,"gene"]
df[,c('gene','exp')]
df[,-ncol(df)]#选取除了最后一列的其他列
df$exp #取列,按tab键补齐;$后是不存在的列名,就是新增加一列
mean(df$exp)
- 数据框修改:取子集$或[ ],再重新赋值向量
运行错了的代码不可以撤销,但可以覆盖
7.练习题
提取test(数据框)中,最后一列值为versicolor或setosa的行,组成一个新的数据框,赋值给test2。
test2 = test[test$Species %in% c("versicolor","setosa"),]
#用$取最后一列species,用%in%判断最后一列中是否包含versicolor或setosa,范围值为T或者F,【】取范围值为T的行
test2 = test[test$Species!="virginica",]
#!为非,否定;反向取
Tips
%in%返回的是T或者F,长度与前面的向量相等
match返回的是后面向量的下标,如果没有出现,就返回NA
> a=sample(1:100,7);a
[1] 58 1 90 84 39 70 16
> b=letters[1:3];b
[1] "a" "b" "c"
> c=c(58,86,84,16);c
[1] 58 86 84 16
> a%in%c
[1] TRUE FALSE FALSE TRUE FALSE FALSE TRUE
> match(a,b)
[1] NA NA NA NA NA NA NA
> match(a,c)
[1] 1 NA NA 3 NA NA 4
数据框列的顺序错乱,如何重排?https://mp.weixin.qq.com/s/rA92iZS8HUiuwlyrPirHdA
提升参考:R语言中的排序,集合运算,reshape,以及merge总结 http://www.bio-info-trainee.com/1071.html
9.数据框连接
cbind#按列连接,行数相同
rbind#按行连接,列数相同
merge(test1,test2,by='name')#根据列名,相同内容合并
merge(x=test1,y=test3,by.x='name',by.y='NAME')#R语言中严格区分大小写
10.矩阵的转置和转换
> m <- matrix(1:9, nrow = 3)#生成矩阵
> colnames(m) <- c("a","b","c") #改列名
> m
a b c
[1,] 1 4 7
[2,] 2 5 8
[3,] 3 6 9
> t(m)#转置
[,1] [,2] [,3]
a 1 2 3
b 4 5 6
c 7 8 9
> as.data.frame(m)#转换
a b c
1 1 4 7
2 2 5 8
3 3 6 9
11.元素命名names( )
可以根据名字取子集
向量、数据框、列表通用
用简单的函数包含两种信息