數(shù)據(jù)挖掘0309

所有資料來源于生信技能樹

  • Tidyverse包

1. 簡介

image.png
image.png

1.1 Tidyr

(1)Tidyr的扁與長

gather-spread


image.png
# gather()命令轉換說明:
# gather(data=數(shù)據(jù)框名,key="key名",value="value名",要轉換的列1,列2,列3)
> gene_exp_tidy <- gather(data = gene_exp, key = "sample_name", value = "expression", Sample1, Sample2, Sample3)
# 在指定要轉換的列時,也可不用列名,直接指定列的編號即可
> gene_exp_tidy <- gather(data = gene_exp, key = "sample_name", value = "expression", 2:4)
#  在指定要轉換的列時,也可指定不需轉換的列,其他列參與轉換
> gene_exp_tidy <- gather(data = gene_exp, key = "sample_name", value = "expression", -GeneId)

(2)Tidyr的分與和

separate-unite


image.png

(3)處理NA

NA賦值
有NA的行都消失

NA行消失后
按照某一列進行刪除NA

drop函數(shù)比omit函數(shù)優(yōu)勢在于可以對某一行進行處理缺失值

NA變成0,然后賦值

填充NA值(用上一行的值)

1.2 dplyr

image.png

(1) mutate()新增列

image.png

新增列后要賦值,數(shù)據(jù)才會改變

(2)select(),按列篩選,filter()按行篩選

image.png

篩選后要賦值,數(shù)據(jù)才會改變

(3)arrange()排序

默認是升序
image.png

多列排序

先按照A列從大到小排序(desc),再按照B列從小到大排序(默認為升序)

排序后要賦值,數(shù)據(jù)才會改變

(4)dplyr關系數(shù)據(jù)

##處理關系數(shù)據(jù):即將2個表進行連接,注意:不要引入factor
options(stringsAsFactors = F)
library(dplyr)
test1 <- data.frame(name = c('jimmy','nicker','doodle'), 
                    blood_type = c("A","B","O"))
test1
test2 <- data.frame(name = c('doodle','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('doodle','jimmy','lucy','nicker'),
                    weight = c(140,145,110,138))
merge(test1,test2,by="name")
merge(test1,test3,by.x = "name",by.y = "NAME")

###1.內連inner_join,取交集,和merge()函數(shù)功能一樣,區(qū)別是inner_join不會改變列的順序,merge()函數(shù)會改變列的順序,共同列會放在第一列
inner_join(test1, test2, by = "name")
inner_join(test1,test3,by = c("name"="NAME"))#當兩個數(shù)據(jù)集中的列名不一樣時使用

###2.左連left_join
left_join(test1, test2, by = 'name')#按照左面的數(shù)據(jù)集(test1)進行合并

left_join(test2, test1, by = 'name')#按照左面的數(shù)據(jù)集(test2)進行合并
###3.全連full_join
full_join(test1, test2, by = 'name')

###4.半連接:返回能夠與y表匹配的x表所有記錄semi_join
semi_join(x = test2, y = test1, by = 'name')

###5.反連接:返回無法與y表匹配的x表的所記錄anti_join
anti_join(x = test2, y = test1, by = 'name')

(5)管道操作%>%(ctrl+shift+M)

image.png

(6)count()

image.png

count輸出的是數(shù)據(jù)框格式
table輸出的是table格式

CHICKEN SOUP

1.3 stringr包

image.png

? 1.檢測字符串長度 str_length(x)
? 2.字符串拆分與組合 str_split( ) /str_c()
? 3.按位置提取字符 str_sub()
? 4.大小寫轉換 str_to_upper()/str_to_lower()/str_to_title()
? 5.字符串定位 str_locate()
? 6.字符檢測 str_detect(x,“h”) –返回邏輯值
? 7.字符提取 str_extract()/ str_extract_all
? 8.字符刪除 str_remove()/ str_remove_all()
? 9.字符串替換 str_replace()/str_replace_all()

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," ")#按照空格拆分,返回的結果類型是列表
class(str_split(x," "))
#[1] "list"
x2 = str_split(x," ")[[1]]

y = c("jimmy 150","nicker 140","tony 152")
str_split(y," ")#輸出長度為3的列表,有n個分隔符,長度為n.
str_split(y," ",simplify = T)#簡化為T,輸出類型為矩陣,而不是列表
class(str_split(y," ",simplify = T))
#[1] "matrix" "array" 
str_c(x2,collapse = " ")
str_c(x2,1234,sep = "+")

###3.提取字符串的一部分
str_sub(x,5,9)

###4.大小寫轉換
str_to_upper(x2)
str_to_lower(x2)
str_to_title(x2)

###5.字符串定位
str_locate(x2,"th")
str_locate(x2,"h")

###6.字符檢測
str_detect(x2,"h")#返回邏輯值,與X2等長,TRUE和FALSE,可以用于取子集
x2[str_detect(x2,"h")]#取結果為TRUE的向量
x2[!str_detect(x2,"h")]#取結果為FALSE的向量

str_starts(x2,"T")
str_ends(x2,"e")

###與sum和mean連用,可以統(tǒng)計匹配的個數(shù)和比例
sum(str_detect(x2,"h"))#
mean(str_detect(x2,"h"))

###7.提取匹配到的字符串
str_extract(x2,"th|Th")
str_extract_all(x2,"o")
str_extract_all(x2,"o",simplify = T)

###8.字符刪除
str_remove(x," ")
str_remove_all(x," ")
str_remove_all(x2,"th")

###9.字符串替換
str_replace(x2,"o","A")
str_replace_all(x2,"o","A")

###結合正則表達式更加強大

2.循環(huán)

image.png

2.1 if...else...

image.png

if后括號里面如果是T的話,執(zhí)行綠色括號里面的,如果是F的話,執(zhí)行黑色括號的代碼


if.else

2.2 ifelse

ifelse
i =1
ifelse(i>0,"+","-")#對照上圖,i>1為x,"此處可以是任何能夠返回邏輯值的函數(shù)"
#+
image.png

對x進行檢查(str_detect函數(shù)返回的是T或F),ifelse函數(shù)對含有h的向量返回為+,不含h的向量返回為-

2.3For循環(huán)

image.png
### 1.for循環(huán)
#**順便看一下next和break**
x <- c(5,6,0,3)
s=0
for (i in x){#用x的值進行循環(huán)
  s=s+i
  #if(i == 0) next
  #if (i == 0) break
  print(c(i,s))
}

x <- c(5,6,0,3)
s = 0
for (i in 1:length(x)){#用x的下標(順序)進行循環(huán)
  s=s+x[[i]]
  print(c(x[[i]],s))
}

x <- c(5,6,0,3)
s=0
for (i in x){#用x的值進行循環(huán)
  s=s+i
  #if(i == 0) next#i=0時進行下一輪循環(huán),不進行下一步即print這一步
  if (i == 0) break#i=0時退出循環(huán)
  print(c(i,s))
}

#如何將結果存下來?
x <- c(5,6,0,3)
s = 0
result = list()#指定result是列表,元素為空
for(i in 1:length(x)){
  s=s+x[[i]]
  result[[i]] = c(x[[i]],s)
}
do.call(cbind,result)#把result(列表)中的元素進行按列組合,形成矩陣
#列表簡化成矩陣的函數(shù):do.call(cbind,listname)

2.4 While~慎用!容易燒電腦!哈哈

image.png

變化的邏輯值

2.5 apply族函數(shù)

(1)apply


#apply(X, MARGIN, FUN, …) 
#其中X是數(shù)據(jù)框/矩陣名;
#MARGIN為1表示取行,為2表示取列,F(xiàn)UN是函數(shù)
apply

對test的每一列取平均值

對test的每一行求和

FUN可以是自定義的函數(shù),那么apply就成為一個自定義的循環(huán)

(2)lapply對列表/向量中的每個元素(向量)實施相同的操作

輸出類型為list
(3)sapply 處理列表,簡化結果,直接返回矩陣和向量

lapply(test,range)#顯示最大值和最小值組成的【列表】
sapply(test,range)#顯示最大值和最小值組成的【矩陣】


實戰(zhàn)重點函數(shù)、知識點復習

image.png

CHICKENSOUP

如果開心你就拍拍手,那不開心呢?就不拍呀!
至于為什么,這很玄學。
大家好像在對著如意金箍棒念咒大大大~

?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

友情鏈接更多精彩內容