写在前面:本文为微信公众号:生信星球的数据挖掘线上班的随堂笔记,感谢小洁老师的付出!
tidyr_dplyr
1.tidyverse
-清空所有变量rm(list =ls())
- 扁变长:gather(data= test, key = 需合并的列_nm,value = exp,- 无需合并的列)#不把
- 长变扁:spread(data= ,key = samle_nm,value =exp)
- 报错直接搜索
- gather没问题但spread会报错:需要唯一的键值对:需要生成唯一索引。group_by(列) %>% mutate (id =1:n()) %>% spread(列,值)
- 分割: separate(数据,需分割的列,c("新列","新列"), sep="分割符号")
-
.
是正则表达式中的“任意字符”,如果需要转译则[.]
或\\.
- 合并:unit(数据,“新列”,旧列1,旧列2,sep="分隔符")
- 如果合并项有NA的话,可以replace_na(数据$列,0)#把na换成0.
赋值才会更改数据,否则不更改。
- 判断两个数据是否完全一致:identical(数据1,数据2)
- 缺失值:
drop_na(数据)#去除含缺失值的行
drop_na(数据,列)#去除含有缺失值的列
7.替换缺失值#直接运行不会赋值
replace_na(数据框$列,0) - fill(x,x2)#用上一行的值填充na
- 去除行名:
rownames(test)=NULL
NA是存在但未知值,NULL是不存在的值。
dplyr
- 新增列: mutate(数据,new= 新列)
- 按列号筛选列: select(数据,c(列1,列2)),或写“列名”
- select的子函数:
start_with
end_with contains("")
matches(".字符.")#只要含有[字符]的咧
last_col()
last_col(offset = 1)#倒数第二列
select(数据,想放在第一列的列,everything())# 换顺序的函数everything
- 筛选行:filter()
filter(数据,列 == “值”)#列是否等于
filter(数据,列1 == “值”&列2>5)#双条件
filter(数据,列 %in%c("值1","值2"))#是否有
4.arrange(),按列对表格排序
- 如果需要按行就转置
arrange(数据,列)#按列从小到大
arrange(数据,desc(列))#按列从大到小
arrange(数据,desc(列1),列2)#优先按列1从大到小排,然后按列从小到大
- summarise()汇总函数
- count(数据框,列)#统计unique值,每个值出现多少次
- %>%: 管道符号
- 连接 merge(数据1,数据2,by=“列名”)
- 内连inner_join #取交集
inner_join(数据1,数据2,by=c("数据1列名" = “数据2列名”)) - 左连,left_join #以左边为准
left_join(数据1,数据2,by=“列名”) - 全连 full_join #全集
full_join(数据1,数据2,by=“列”) - 半连接 semi_join() #返回存在y表,不存在于x表的所有x的行值
- 反连接 anti_join() #与12相反
- 查看两列有多少一样的值 length(intersect(表1列2))
stringr
rm(list = ls())
if(!require(stringr))install.packages('stringr')
library(stringr)
x <- "The birch canoe slid on the smooth planks."
x
###1.检测字符串长度
length(x)
str_length(x)
###2.字符串拆分与组合
str_split(x," ") #生成了一个列表
x2 = str_split(x," ")[[1]] #提取为字符串
str_c(x2,collapse = " ")#组合,标点符号=空格
###3.提取字符串的一部分
str_sub(x,5,9) #提取第五到第九位
###4.大小写转换
str_to_upper(x2) #全大写
str_to_lower(x2) #全小写
str_to_title(x2) #全首字母大写
###5.字符串排序
str_sort(x2)
###6.字符检测
str_detect(x2,"h") #检测向量X2中是否有h
str_starts(x2,"T") #检测字符串的首字母是否是T
str_ends(x2,"e")
#产生和字符串等长的逻辑值向量,可以用来取子集[]
###与sum和mean连用,可以统计匹配的个数和比例
sum(str_detect(x2,"h"))
mean(str_detect(x2,"h"))
###7.提取匹配到的字符串
str_subset(x2,"h") #提取含有h的字符串
###8.字符计数
str_count(x," ") #数有多少个空格
str_count(x2,"o")
###9.字符串替换
str_replace(x2,"o","A") #替换第一个o为A
str_replace_all(x2,"o","A") #替换全部
条件语句
if(){
}else{}
- ifelse(x,yes,no)#x:逻辑值,yes:逻辑值为TRUE时,no:返回值为FALSE时,函数只有三个参数
- 可以利用ifelse对x进行分组。
- 长脚本管理方式:
- 分成多个脚本,最后保存Rdata,下一个脚本开头清空。
- if(F){这里被跳过}
if(T){这里被运行}
- 可以折叠,很好看
3.for(i in x){}#
- cat函数约等于print,但cat输出的结果没有“”
- 1.对向量里的每个元素进行循环for(i
in x) - 2.按向量的下标进行循环for(i in 1:length(x))
- 把元素长度相同的列表组成一个矩阵:
do.call(cbind,列表)
- switch(EXPR=几,第一个结果,第二个结果....)#开关选择
- do.call(cbind,列表) #生成矩阵
- while(){ ... i = i+1}#当。。。的时候
- 小括号内为单一逻辑值,随循环变化。
6.apply函数(X,MARGIN,FUN)
rm(list = ls())
## 一.条件语句
###1.if(){ }
#### (1)只有if没有else,那么条件是FALSE时就什么都不做
i = -1
if (i<0) print('up')
if (i>0) print('up')
#理解下面代码
if(!require(tidyr)) install.packages('tidyr')
#### (2)有else
i =1
if (i>0){
cat('+')
} else {
print("-")
}
ifelse(i>0,"+","-")
x=rnorm(10)
y=ifelse(x>0,"+","-")
y
#### (3)多个条件
i = 0
if (i>0){
print('+')
} else if (i==0) {
print('0')
} else if (i< 0){
print('-')
}
ifelse(i>0,"+",ifelse((i<0),"-","0"))
### 2.switch()
cd = 3
foo <- switch(EXPR = cd,
#EXPR = "aa",
aa=c(3.4,1),
bb=matrix(1:4,2,2),
cc=matrix(c(T,T,F,T,F,F),3,2),
dd="string here",
ee=matrix(c("red","green","blue","yellow")))
foo
#练习6-3
#1.使用循环,查看"a",TRUE和3的数据类型
x <- list("a",TRUE,3)
i=1
for (i in x
) { print(class(x[[i]]))
}
#2.生成10个随机数,根据这10个随机数生成一个新向量,>中位数的值对应"A",<中位数的值对应"B"。
y <- rnorm(10)
i=1
s=c()
for(i in y){ifelse(y[i]>median(y),s <- cbind(s,"A"),s<- cbind(s,"B"))}
s
#3.根据上一练习题中的tmp2生成一个新向量,含有e的值对应"A",不含有e的值对应"B"
#4.加载deg.Rdata,根据a、b两列的值,按照以下条件生成向量x:
#a<1 且b<0.05,则x对应的值为down;
#a>1 且b<0.05,则x对应的值为up;
#其他情况,x对应的值为no
# 5.统计x的重复值个数
# 6.将x添加到deg数据框中,成为新的一列
## 二、循环语句
### 1.for循环
#**顺便看一下next和break**
x <- c(5,6,0,3)
s=0
for (i in x){
s=s+i
#if(i == 0) next
#if (i == 0) break
print(c(which(x==i),i,1/i,s))
}
x <- c(5,6,0,3)
s = 0
for (i in 1:length(x)){
s=s+x[[i]]
#if(i == 3) next
#if (i == 3) break
print(c(i,x[[i]],1/i,s))
}
#如何将结果存下来?
s = 0
result = list()
for(i in 1:length(x)){
s=s+x[[i]]
result[[i]] = c(i,x[[i]],1/i,s)
}
do.call(cbind,result)
#练习6-4 :
#1.使用循环,对iris的1到4列分别画点图(plot)
#2.生成一个随机数(rnorm)组成的10行6列的矩阵,列名为sample1,sample2….sample6,行名为gene1,gene2…gene10,分组为sample1、2、3属于A组,sample4、5、6属于B组。用循环对每个基因画ggplot2箱线图。
### 2.while 循环
i = 0
while (i < 5){
print(c(i,i^2))
i = i+1
}
### 3.repeat 语句
#注意:必须有break
i=0L
s=0L
repeat{
i = i + 1
s = s + i
print(c(i,s))
if(i==50) break
}
apply
apply(X,MARGIN,FUN,...)#x为数据框或矩阵,MARGIN为1表示取每一行,2表示取每一列,FUN为函数
遍历,创建,删除文件夹
- dir()
- file.creat() file.exists()
- file.remove()
- file.rename(from, to)
- file.append(file1, file2)
- file.copy(from, to)
- dir.create("mou")
- unlink("mou",recursive =T)
- flie.symlink(from, to)
- file. link(from,to)
总结
1.tidyr 常用于将表格的扁和长,分和合进行转换
2.dplyr
- 基础函数:新增mutate,筛选select/filter,排序arrange,汇总summarise
- 进阶函数:数unique值count,管道符号ctrl+shift+m
- sort=排序
- match=根据一个向量对另一个排序
- names是向量的名字
- arrange是针对某一列对整个数据框排序
- merge和inner-join是将两个数据框连接(有一列是共同的,有交集)
- unique是去重复
- dupilicated是判断是否有重复(有则TRUE),形成逻辑值
- 向量/数据框/取子集
- 数据框新增列——1 $,2 mutate
- 文件的读取-import
- 作图保存1 ggsave 2 三段论
作业很难:
#1.test=head(iris),将test的前4列gather,然后还原
rm(list = ls())
library(tidyr)
library(dplyr)
test=head(iris)
x= gather(test[1:4],
key = var,
value = num)
## 这里有一个坑,哈德雷大神亲自回答过,看代码
x2 = x %>%
group_by(var) %>%
mutate(id=1:n()) %>%
spread(var,num)
#2.将第三列分成两列(以小数点为分隔符),然后合并
x=separate(test,Sepal.Width,into = c('a','b'),sep = "[.]")
x
x_re=unite(x,"Sepal.Width",a,b,sep = ".")
x_re
str(x_re)
#看起来代码没什么不妥,但是仔细一看会发现其实有个坑,原始数据的第二行第二列是3.0,分割后0变成了NA,合并回来也是不对的。
#这个需求其实并不常见,只是为了作为一个例子,但这里还是说一下解决方案:
x=separate(test,Sepal.Width,into = c('a','b'),sep = "[.]") %>%
tidyr::replace_na(list(b=0))
x
x_re=unite(x,"Sepal.Width",a,b,sep = ".")
x_re$Sepal.Width = as.character(x_re$Sepal.Width)
x_re
str(x_re)
#3.加载test1.Rdata,将deg数据框按照pvalue从小到大排序
load('test1.Rdata')
x=arrange(deg,P.Value);head(x)
#4. 将两个数据框按照probe_id列连接在一起
x=merge(deg,ids,by = "probe_id")
x2=inner_join(deg,ids,by = "probe_id")
3. stringr:专门处理字符串的包
- 需要注意.在正则表达式表示任意字符,如果作为句号需要转译。
#练习6-2
#Bioinformatics is a new subject of genetic data collection,analysis and dissemination to the research community.
#1.将上面这句话作为一个长字符串,赋值给tmp
tmp <- "Bioinformatics is a new subject of genetic data collection,analysis and dissemination to the research community."
#2.拆分为一个由单词组成的向量,赋值给tmp2(注意去除句号和逗号)
tmp2 = str_split(tmp,c(" ",","))[[1]] %>%
str_replace("\\.","")
tmp2
#3.用函数返回这句话中有多少个单词。
length(tmp2)
#4.用函数返回这句话中每个单词由多少个字母组成。
str_length(tmp2)
#5.统计tmp2有多少个单词中含有字母"e"
length(tmp2[str_detect(tmp2,"e")] )
table(str_detect(tmp2,"e"))#看看有几个true