—————————第一部分[三维数据结构]———————
一、三维数据结构
数组概况:
二维
数据结构——矩阵
↓
叠加二维矩阵(矩阵切片/吐司切面)
↓
三维
数据结构——array(吐司) 即dim(x,y,z)
数组的特殊形式 :二维 矩阵
array()
①格式:
array(data=NA,dim=length(data),dimnames=NULL)
array表示三维矩阵,所以array设置三层dim维数。
z <- array(1:24, dim = 2:4)
②索引:用[]
或者,
eg:对z的每一层取平均值
>z <- array(1:24, dim = 2:4)
> mean(z[,,1])
[1] 3.5
> mean(z[,,2])
[1] 9.5
> mean(z[,,3])
[1] 15.5
> mean(z[,,4])
[1] 21.5
> apply(z,3,mean)
[1] 3.5 9.5 15.5 21.5
这里用两个
,
隔开,出现三个间隔,分别表示行、列、层。
二、apply()函数
①格式:
apply(x,mar,FUN)
①mar=1,代表行;mar=2,代表列;mar=3,代表层
②apply()函数的输入、输出值为规整的格式:array、data.frame
Eg:
z <- array(1:24, dim = 2:4)
apply(z,3,mean)
三、lapply()函数及sapply()函数
1、lapply()
①格式:lapply(X,FUN)
说明:
A、关于X
参数:
a、lapply中的x是对list中每一列的元素进行操作;若是矩阵,则对矩阵进行操作 以此类推
b、lapply中的x参数,只要是单位元素的 都可以加入
B、FUN
可以是某一个函数
②输入的格式为list(行间数据类型不规整)
③输出数据类型为list
EG:
x <- list(1:10,2:8,5:7)
lapply(x,mean)
class(lapply(x,mean)) ##lapply返回结果为list
2、sapply()
①格式:sapply(X,FUN...,simplify=T)
simplify=T为默认设置;若simplify=F,则返回结果与lapply相同,输出的数类型据为list
②输出格式为:list(行间数据类型不规整)
③输出数据类型为矩阵
;若输出数据类型为向量√,向量(一维矩阵)是矩阵中的特例
———————————第二部分[分组]———————————
一、因子
①格式:
factor(x = character(), levels, labels = levels,exclude = NA, ordered = is.ordered(x), nmax = NA)
②因子分为有序因子和无序因子;ordered=T为有序因子;ordered=F为无序因子
eg:
load('flag.Rdata')###加载要用的数据
####创建一个向量
topleft <- flag$topleft
table(flag$topleft)
class(flag$topleft)
set.seed(0709)
####源于向量的因子
topleft1 <- factor(topleft,ordered = TRUE)
结果:
③意义:
以GEO分析为例,对数据进行分组处理时,需将数据都转化为factor,才可以对数据进行分组(level
)
④所有的factor必须是level的元素
如上图,总结:
①一组数据包括两部分:
上面的内容为factor
,下面的分组种类信息为level
②level
为上面所有内容的unique
③图示说明:
理论:
举例:
④factor与level为对应关系;若数据类型为character,则没有level
⑤level排序可以影响图片的顺序
可参考:
http://blog.sina.com.cn/s/blog_6cb445270102yjxa.html
https://blog.csdn.net/hsdcc217/article/details/78510087
二、split()函数
①格式:
split(x,f,drop=F,...)
①x是待分组数据,f是分组依据,drop=T为删除不存在的level
②因子f与待分组数据x长度应一致
③因子f是分组依据,分组依据可有多个标准,该标准用list承接;分组依据的组合为图一的组合搭配所示,若1-A有结果则输出结果;若1-A未匹配出结果,则输出integer(0)
④数据格式:待分组数据x的数据类型为data.frame ;输出结果的数据类型为list
Eg:
>load('flag.Rdata')
>split(flag$landmass,list(flag$zone,flag$topleft))
>unique(flag$zone)
[1] 1 3 2 4
>unique(flag$topleft)
[1] "black" "red" "green" "blue" "white" "orange" "gold"
>length(split(flag$landmass,list(flag$zone,flag$topleft)))
[1] 28
> length(split(flag$landmass,list(flag$zone,flag$topleft),drop = T)) ###drop去掉不存在的因子
[1] 24
三、tapply()
在split()的基础上进一步分析,添加“FUN”
①格式:
tapply(X, INDEX, FUN = NULL, ..., default = NA, simplify = TRUE)
①X是待分组数据
②INDEX是分组信息(可以有几个因子,用list承接组合因子即可)
③A与B可以没关系 但是长度一样
④FUN为计算函数
Eg:
>load('flag.Rdata')
> tapply(flag$landmass,flag$topleft,mean)
black blue gold green orange red white
3.416667 3.255814 2.500000 3.625000 4.500000 3.982143 3.414634
> tapply(flag$landmass,list(flag$zone,flag$topleft),mean)
black blue gold green orange red white
1 3.857143 4.263158 4.000000 4.230769 4.666667 4.375000 4.000000
2 5.000000 5.000000 NA 4.000000 4.000000 4.571429 5.428571
3 NA 3.600000 2.000000 2.000000 NA 3.000000 4.000000
4 1.333333 1.400000 1.666667 2.700000 NA 3.000000 1.571429
——————————第三部分[循环函数]———————————
一、while()
①格式:
while(i){XX
i*}
①i是设置循环数,返回结果是一个逻辑值;xx是执行的一个操作,为逻辑操作;而i*是对i作出的更改,否则就近进入一个死循环
②break,next可以嵌套在while中使用
②while()循环中,数据输入为真 ,输出为假
③while()是一个循环操作,如果要得到一个输出结果需要有一个容器接住。所以,在运用while函数时,要先了解、熟悉while的输出结果,创建一个空的数据结构,接住while的输出结果(如:tmp<-c()
)
Eg:
> i <- 1
> #####熟悉会产生什么结果,创建相应大小的数据结构
> tmp <- c()
> while (i <=6) {
+ tmp[i]<- letters[i]
+ i = i+1####要有这种设置,才会对i产生改变,才不会是死循环
+ }
> tmp
[1] "a" "b" "c" "d" "e" "f"
二、ifelse()
①格式:
ifelse(test, yes, no)
②if:只是处理第一个元素,若为真,就输出结果;处理的是多个一个
逻辑值,得到的是一个
输出
③ifelse:是处理一串
逻辑值,得到一串
输出结果;
④注意其中的嵌套ifelse (逻辑缜密一些);若嵌套,则从里到外一层层看
——————————第四部分[数据处理]———————————
一、排序
1、sort、order、rank区别
基础数据:input输入数据
sort:返回结果为排序后的数值;返回数值结果默认升序
order:返回结果output中的数据应来源于input的位置信息(为位置信息,不非具体数值);将sort的输出结果递进;可作用于多个向量
rank:返回结果input的排名(为位置信息,不非具体数值);
2、全集、交集、差集
union(a,b) : a与b的全集
intersect(a, b): a与b的交集
setdiff(a, b) : 差集a有 ,b没有;返回的是去重结果
setdiff(b, a) : 差集b有,a没有;返回的是去重结果
相关的理解代码请看:
E:/生信技能树/[ZHUHAI_Biotrainee]/GuangZhou/R_2/step04_1_set_sort_rank_order
二、字符串处理
"E:/生信技能树/[ZHUHAI_Biotrainee]/GuangZhou/R_2/RegExCheatsheet
"以及"E:/生信技能树/[ZHUHAI_Biotrainee]/GuangZhou/R_2/step05__2_character_operation
’'以及以及"E:/生信技能树/[ZHUHAI_Biotrainee]/GuangZhou/R_2/step05__1_regular_exp
’'中含有很多的字符串符号说明
1、字符串符号_常用总结
1、
[^]
取反
2、{}
匹配次数设置
3、$
字符位于字符尾部;尾部
4、^
后面字符位于字符首位;首位
5、^t
后面字符位于字符首位
6、\\d
表示数字
7、\\D
表示非数字
8、\\w
表示字母、数字、下划线[A-Za-z0-9_]
9、\\W
表示匹配非字母、数字、下划线
10、\\s
匹配空白字符
11、\\S
匹配非空白字符
2、sub()、gsub()
①共同点:
A、替换匹配字符
B、格式:gsub/sub(‘替换的目标字符串”,"被替换的字符串",X)
其中,X为在该数据分为内进行匹配替换操作
②不同点:
sub():只替换第一次匹配的字符串
gsub():替换掉所有匹配的字符串
3、strsplit()
①格式:
strsplit(x, split, fixed = FALSE, perl = FALSE, useBytes = FALSE)
*strsplit()输出结果的数据类型为list
*x
为待分割的字符串,split
为用什么进行分割,可以用空格等分隔符号,输入即可
Eg:
> tmp<-'1053_at,117_at,121_at,1255_g_at,1316_at,1320_at,1405_i_at,1431_at,1438_at,1487_at,1494_f_at,1598_g_at,160020_at,1729_at'
> class(tmp)
[1] "character"
> length(tmp)
[1] 1
> strsplit(tmp,split=',')
[[1]]
[1] "1053_at" "117_at" "121_at" "1255_g_at" "1316_at" "1320_at" "1405_i_at" "1431_at" "1438_at"
[10] "1487_at" "1494_f_at" "1598_g_at" "160020_at" "1729_at"
> strsplit(tmp,split=',')[[1]]
[1] "1053_at" "117_at" "121_at" "1255_g_at" "1316_at" "1320_at" "1405_i_at" "1431_at" "1438_at"
[10] "1487_at" "1494_f_at" "1598_g_at" "160020_at" "1729_at"
三、数据匹配
1、grep()、grepl()
①grep()函数
A、格式:
grep( array, function [, invert ],value=T )
输入数据类型为array;如果参数invert为true,则结果数组将包含function返回false的所有元素。
B、输出结果为返回位置;若value=T,则返回的就是匹配到的数值
②grepl() 返回结果为逻辑值
③nchar() 对查看字符个数(包括空格)
2、match()
①格式:
match(x,table)
A、在table中找到x ;
B、只返回第一个匹配的位置;
C、输出结果的长度与x的长度一致
3、%in%
①格式:A%in%B
*返回数据类型为逻辑值
*输出结果的数据长度与A的长度一致
Eg:
> 'EGF_12h'%in%tmp
[1] TRUE
> tmp%in%'EGF_12h'
[1] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE TRUE TRUE TRUE
> length(tmp)
[1] 12
> length('EGF_12h')
[1] 1
4、which()
①格式:
which(x, arr.ind = FALSE, useNames = TRUE)
*x为输入数据,数据类型为逻辑值
*返回结果为输入数据为T时的元素位置
;若arr.ind = T,数组的形式返回
Eg:
> which(tmp%in%c('EGF_12h','EGF_4h'))
[1] 1 2 3 10 11 12
> tmp[which(tmp=='EGF_12h')]
[1] "EGF_12h" "EGF_12h" "EGF_12h"
5、merge()
①格式:merge(x, y, ...)
*x/y的数据结构都为data.frame
*merge是对待合并对象的列
进行合并;x、y列的长度需一致
*merge的输出数据结构为data.frame
②关于merge的几个重要参数
by:当merge的合并对象x,y的列名都相同时,则选择by
by.x:是将待合并对象x中指定列的所有内容都容纳进去
by.y:是将待合并对象y中指定列的所有内容都容纳进去