寫在前面:
R包都有自己的說明書(cheatsheet),俗稱小抄僧叉。在對包有了一定的了解后奕枝,小抄是一個很好的學習操作指南,但是對于新手來說瓶堕,很有可能完全看不懂隘道。今天的教程有一部分參照了小抄,并作出了通俗的解釋郎笆。相信跟著教程走下去谭梗,就可以學個七七八八,跟著練練题画,然后自己研究一下小抄默辨,一個R包就學個差不多啦。
準備工作part1:學會獲取一個R包的小抄
方法1:去百度/谷歌XX小抄
方法2:找Rstudio的cheatsheet網(wǎng)站(網(wǎng)速好慢的)
https://www.rstudio.com/resources/cheatsheets/
方法2.我們教程里用到的包都可以到生信星球公眾號回復(fù)相應(yīng)的包名來獲取苍息,比如這個:
缩幸。壹置。。
準備工作part2:初步了解tidyr
(從這里開始到分割線以上的部分是我親愛的謝師姐測試教程的時候提出讓我加上的表谊,先介紹一下這個包能干啥)
關(guān)于R包的學習不打算系統(tǒng)講了钞护,直接從這個名叫tidyr的包開始上手。這是一個數(shù)據(jù)處理的起步爆办,相對來說屬于R包里簡單的了难咕。
它的功能主要有:
(1)數(shù)據(jù)框的變形
(2)處理數(shù)據(jù)框中的空值
(3)根據(jù)一個表格衍生出其他表格
(4)實現(xiàn)行或列的分割和合并
這個包是把你要用的數(shù)據(jù)處理成標準而統(tǒng)一的數(shù)據(jù)框(Tidy Data,下面有解釋)距辆,才能進行進一步的數(shù)據(jù)處理和作圖余佃,可以說是萬里長征第一步!
準備工作part3--學習極簡安裝R包:
1.準備好Rstudio(恭喜你跳過了安裝的坑)跨算,設(shè)置好工作目錄爆土。
在控制臺輸入:library(tidyr)
,如果你沒有這個包,就會報錯:
2.下載和安裝tydir:install.packages("tidyr")
(這里會默認安裝到你的工作目錄里诸蚕,下載很慢步势,只要控制臺不出現(xiàn)>,就一直等著)
可能出現(xiàn)的報錯:
解決方案:換一個國內(nèi)的鏡像
加載tydir:library(tidyr)
(沒有報錯就是成功)
準備工作part2:數(shù)據(jù)框的小常識
1.新建數(shù)據(jù)框(這里直接把新建的數(shù)據(jù)框賦值給了a)
a<-data.frame(GeneId = rep("gene5",times=3),SampleName =paste("Sample",1:3,sep=""),Expression=c(14,19,18))
得到的數(shù)據(jù)框是
新建一個數(shù)據(jù)框并賦值給bioplanet這個變量(賦值符號<-還記得嘛)括號里是“列名”=列值背犯,這里列名要加雙引號坏瘩。這里涉及的幾個給列填充數(shù)值的函數(shù)有
rep
,重復(fù)漠魏,括號中填要重復(fù)的字符和重復(fù)次數(shù)倔矾。
paste
,連接兩個字符串蛉幸,括號要填兩個代連接字符并指定分隔符(sep)破讨,沒有分隔符就填sep=“”。
1:3表示從1到三奕纫。如需一列中需要填入三個無規(guī)律的數(shù)字,可以用向量c(1烫沙,3匹层,4)
,同樣如果填的是字符串也需要加雙引號锌蓄,例如c("doudou","huahua","xiaoyu")
升筏。
2.了解概念:key-value--“鍵值對” ,表示一種對應(yīng)關(guān)系瘸爽∧茫“鍵”和“值”都是列名,如SampleName和Expression的對應(yīng)剪决。
3.函數(shù)后面一般都要加括號灵汪,括號里第一個參數(shù)是都數(shù)據(jù)框名
4.字符串要加雙引號(行名和列名也是字符串檀训,但是可以不用加),其他單元格(姑且這么叫了)里出現(xiàn)的字符串要加享言。
行 raw
列 column峻凫,簡化寫法為col
準備工作part3:認識Tidy Data
TidyData?泰迪數(shù)據(jù)是神馬數(shù)據(jù)览露?我想到了如下兩坨:
皮一下我就是很開心荧琼!皮完查字典去:
這是一種組織表格數(shù)據(jù)的方式,提供了一種能夠跨包使用的“統(tǒng)一”的數(shù)據(jù)格式差牛。
什么叫“統(tǒng)一”命锄?
每個變量(variable)占一列,每個情況(case偏化,姑且這么翻譯)和觀測值(observation)占一行累舷。
舉個栗子
看到嗎?一列是一列夹孔,是魔鬼的步伐被盈。不要讓sample1,2搭伤,3當列名只怎,讓他們多重復(fù)幾遍,合并到一列怜俐。
數(shù)據(jù)由九宮格變成了一列身堡,就可以用來跨包處理啦。
這就是實現(xiàn)了數(shù)據(jù)框的變形??拍鲤。
終于準備完了我的媽呀
1.Reshape Data
哦贴谎,我知道你想要魔法棒,來季稳。
gather:我就是剛才的魔法棒
spread:我能讓tidy data一夜回到解放前擅这。
(下面的類似截圖都是來自小抄)
在這里如何復(fù)制上圖中的數(shù)據(jù)?(比較特殊的一點是列名是數(shù)字景鼠,這個還沒碰見過仲翎,因此對它這個列名動了一點手腳,不管給他們加雙引號铛漓、單引號還是反引號(英文模式下的1前面那個鍵)溯香,都沒有報錯!但是不加引號是不行滴浓恶。
但是我發(fā)現(xiàn)這個顯示表格的時候玫坛,會自動在數(shù)字列名前面加上個x(大寫的),就像這樣
由于它自動加了X包晰,寫列名的時候就不能按照小抄上面寫湿镀,而是:
gather(a,X1999,X2000,key = "year",value = "cases")
gather括號里的分別是:
數(shù)據(jù)框名炕吸,需合并的列名(兩個),合并后的key列名肠骆,value列名算途。
其中,需合并的列名也可以列在最后(其實個順序才是默認的)蚀腿,key=和value=也可以省略(我愛偷懶)嘴瓤,如果按照上面小抄的命令括號里那個順序,省略了就會報錯莉钙。
gather(a,"year","cases",X1999,X2000) #推薦的偷懶做法
其中廓脆,合并前的列名如果比較多,可以用排除法來偷懶磁玉,在上圖例子中可用
gather(a,year,cases,-country) #-country的意思就是合并除country外剩下的列停忿。
2.Handle Missing Values
處理丟失的數(shù)據(jù)。就是某些單元格有空值的情況蚊伞。
三種處理方式:
(1).刪除整行
(2).根據(jù)上下文(瞎)蒙一個
(3).同一列的空值填上同一個數(shù)席赂。
將示例數(shù)據(jù)放在你的RData文件夾下(!J逼取颅停!重要)
NA表示空值,所以新建的時候像我一樣空著就好掠拳。
用以下命令即可獲得圖示數(shù)據(jù)框X
X<-read.csv('doudou.txt')
可能別人不會這么教癞揉,但我在這里之所以選擇了csv,是因為這個神奇的支持R和Excel溺欧,默認參數(shù)好的很(默認分隔符是“喊熟,”,導(dǎo)出時也不會默認加引號姐刁。如果你用read.table試試就知道默認參數(shù)多笨了)芥牌,并且轉(zhuǎn)換txt也不會變亂碼!(我自己發(fā)現(xiàn)的龙填,想夸我千萬別忍著)
在這里補充下csv的導(dǎo)入和導(dǎo)出方式胳泉。(默認參數(shù)好,學R沒煩惱)
導(dǎo)入:X<-read.csv('doudou.csv')
導(dǎo)出:write.csv(X,'doudou.csv')
drop_na()
:有空值的岩遗,整行刪除掉
括號里填數(shù)據(jù)框名,依據(jù)的列名(有空值那一列的列名)
drop_na(X,X2)
fill()
凤瘦,根據(jù)上一行的數(shù)值填充上(好應(yīng)付的感覺)
fill(X,X2)
replace_na()
宿礁,空值填進去特定的一個數(shù)值(還是在應(yīng)付)
括號里填數(shù)據(jù)框名,要填的列名=要填的值
replace_na(X,list(X2=2))
3. Expand Tables
這個地方,好像就是湊數(shù)蔬芥,目前我并不知道他有啥用梆靖。這部分的代碼刪掉了,在截圖里面有。請手打哦
complete(把空值的位置補全)
可以直接用剛才的數(shù)據(jù)框X填充一下試試谅将。比如填5
我用的數(shù)據(jù)是com.csv:
讀取的命令是com <- read.csv("com.csv")
其中有三個空值刚梭,我要填充上ddd relate
expand
(列出每列值所有可能的組合--根據(jù)下面的示例來理解這句話)
來看示例(以前年紀小不懂事,數(shù)據(jù)框名胡亂取的):
示例數(shù)據(jù)(就是剛才新建出來的數(shù)據(jù)框a):
pin2<-data.frame(GeneId = rep("gene5",times=3),SampleName =paste("Sample",1:3,sep=""),Expression=c(14,19,18))
我是看到了結(jié)果才知道我干了啥的测僵。就是選中的列中的值各種組合街佑,成為一個新表。(明白捍靠?)
4.split cells(選修)
把一列拆成兩列沐旨。目測原列必須要有分隔符才行啊好像。
separate
:按列分割
separate_rows
:按行分割
unite
:分割完了再合并回去