TCGA_07

写在前面:本文为微信公众号:生信星球数据挖掘线上班的随堂笔记,感谢小洁老师的付出!

tidyr_dplyr

1.tidyverse

-清空所有变量rm(list =ls())

  1. 扁变长:gather(data= test, key = 需合并的列_nm,value = exp,- 无需合并的列)#不把
  2. 长变扁:spread(data= ,key = samle_nm,value =exp)
  • 报错直接搜索
  • gather没问题但spread会报错:需要唯一的键值对:需要生成唯一索引。group_by(列) %>% mutate (id =1:n()) %>% spread(列,值)
  1. 分割: separate(数据,需分割的列,c("新列","新列"), sep="分割符号")
  • .是正则表达式中的“任意字符”,如果需要转译则[.]\\.
  1. 合并:unit(数据,“新列”,旧列1,旧列2,sep="分隔符")
  • 如果合并项有NA的话,可以replace_na(数据$列,0)#把na换成0.

赋值才会更改数据,否则不更改。

  1. 判断两个数据是否完全一致:identical(数据1,数据2)
  2. 缺失值:
    drop_na(数据)#去除含缺失值的行
    drop_na(数据,列)#去除含有缺失值的列
    7.替换缺失值#直接运行不会赋值
    replace_na(数据框$列,0)
  3. fill(x,x2)#用上一行的值填充na
  • 去除行名:rownames(test)=NULL

NA是存在但未知值,NULL是不存在的值。

dplyr

  1. 新增列: mutate(数据,new= 新列)
  2. 按列号筛选列: select(数据,c(列1,列2)),或写“列名”
  • select的子函数:
    start_with
    end_with contains("")
    matches(".字符.")#只要含有[字符]的咧
    last_col()
    last_col(offset = 1)#倒数第二列
    select(数据,想放在第一列的列,everything())# 换顺序的函数everything
  1. 筛选行:filter()
    filter(数据,列 == “值”)#列是否等于
    filter(数据,列1 == “值”&列2>5)#双条件
    filter(数据,列 %in%c("值1","值2"))#是否有
    4.arrange(),按列对表格排序
  • 如果需要按行就转置
    arrange(数据,列)#按列从小到大
    arrange(数据,desc(列))#按列从大到小
    arrange(数据,desc(列1),列2)#优先按列1从大到小排,然后按列从小到大
  1. summarise()汇总函数
  2. count(数据框,列)#统计unique值,每个值出现多少次
  3. %>%: 管道符号
  4. 连接 merge(数据1,数据2,by=“列名”)
  5. 内连inner_join #取交集
    inner_join(数据1,数据2,by=c("数据1列名" = “数据2列名”))
  6. 左连,left_join #以左边为准
    left_join(数据1,数据2,by=“列名”)
  7. 全连 full_join #全集
    full_join(数据1,数据2,by=“列”)
  8. 半连接 semi_join() #返回存在y表,不存在于x表的所有x的行值
  9. 反连接 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进行分组。
  • 长脚本管理方式:
  1. 分成多个脚本,最后保存Rdata,下一个脚本开头清空。
  2. 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,列表)
  1. switch(EXPR=几,第一个结果,第二个结果....)#开关选择
  • do.call(cbind,列表) #生成矩阵
  1. 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为函数

遍历,创建,删除文件夹

  1. dir()
  2. file.creat() file.exists()
  3. file.remove()
  4. file.rename(from, to)
  5. file.append(file1, file2)
  6. file.copy(from, to)
  7. dir.create("mou")
  8. unlink("mou",recursive =T)
  9. flie.symlink(from, to)
  10. 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

你可能感兴趣的:(TCGA_07)