利用R進(jìn)行數(shù)據(jù)操作(基礎(chǔ)知識(shí)篇)

基本數(shù)據(jù)管理

目標(biāo):

  • 操作日期和缺失值
  • 熟悉數(shù)據(jù)類型的轉(zhuǎn)換
  • 變量的創(chuàng)建和重編碼
  • 數(shù)據(jù)集的排序、合并與取子集
  • 選入和丟失變量

案例:
R in action提供,用于研究男性和女性在領(lǐng)導(dǎo)各自企業(yè)上的不同

manager <- c(1,2,3,4,5)
date <- c("10/24/08","10/1/08","10/12/08",""5/1/09)
country <- c("US","US","UK","UK","UK")
gender <- c("M","F","F","M","F")
age <- c(32,45,25,39,99)
q1 <- c(5,3,3,3,2)
q2 <- c(4,5,5,3,2)
q3 <- c(5,2,5,4,1)
q4 <- c(5,5,5,NA,2)
q5 <- c(5,5,2,NA,1)
leadership <- data.frame(manager,date,country,gender,age,q1,q2,q3,q4,q5,stringAsFactors=FALSE)

實(shí)際操作

1.創(chuàng)建新變量

變量名 <- 表達(dá)式
mydata <- transform(mydata,sumx = x1+x2,
                    meanx = (x1+x2)/2)

2.變量重編碼
重編碼:根據(jù)同一個(gè)變量和/或其他變量的現(xiàn)有值創(chuàng)建新值的過(guò)程。過(guò)程涉及邏輯判斷。

  • 連續(xù)變量修改為類別值
  • 誤編碼的值修改為正確值
  • 根據(jù)某一個(gè)標(biāo)準(zhǔn)創(chuàng)建新變量
leadership$age[leadership$age == 99] <- NA

leadership <- within(leadership,{
  agecat <- NA
  agecat[age >75] <- "Elder"
  agecat[age >= 55 && age <=75 ] <- "Middle Aged"
  agecat[age <55] <- "Young"
 })

一些重編碼函數(shù):car包的recode(),doBy包的recodevar(),自帶的cut()

3.變量重命名

names(leadership)[2] <- "testDate

推薦:dplyr::rename

4.缺失值
缺失值以NA表示。
判斷:is.na
注意:缺失值不可比較,無(wú)法用比較運(yùn)算符檢測(cè);R語(yǔ)言有專門符號(hào)來(lái)表示無(wú)限大(+ inf,-inf)和不可能的值(NaN)
分析中注意各個(gè)函數(shù)對(duì)缺失值的處理,可以使用na.omit()刪除所有含有缺失數(shù)據(jù)的行。

5.日期值
使用as.Date()將字符型日期值變?yōu)閿?shù)值形式
使用as.character()將數(shù)值形式的日期變成字符型

6.類型轉(zhuǎn)換
R語(yǔ)言中提供了大量用于判斷某個(gè)對(duì)象的數(shù)據(jù)類型和轉(zhuǎn)換方式

判斷 轉(zhuǎn)換
is.numeric() as.numeric()
is.character() as.character()
is.vector() as.vector()
is.matrix() as.matrix()
is.data.frame() as.data.frame()
is.factor() as.factor()
is.logical() as.logical()

7.數(shù)據(jù)排序
根據(jù)年齡進(jìn)行排序

newdata <- leadership[oerder(leadership$age)]

8.數(shù)據(jù)集合并

  • 向數(shù)據(jù)框添加列
total  <- merge(dateframeA,dataframeB,by="ID")
  • 向數(shù)據(jù)框添加行
    一定要有相同的變量
total <- rbind(dataframeA,dataframeB)

9.數(shù)據(jù)集取子集

  • 選入(保留)變量
#data.frame[row indices, column indices]
newdata <- leadership[,c(6:10)]
  • 剔除(丟棄)變量
    例如,剔除q3和q4列
# 法1
newvar <- names(leadership) %in% c("q3","q4")
newdata <- leadership[!newvar]
# 法2
newdata <- leadership[c(-8,-9)]
# 法3
leadership$q3 <- leadership$q4 <- NULL
  • 選入觀測(cè)
newdata <- leadership[1:3,]
newdata <- leadership[leadership$gender =="M" & leadership$age > 30,]
  • subset函數(shù)
    比較簡(jiǎn)單的方法:
newdata <- subset(leadership,age >= 35 | age <24, select=c(q1,q2,q3,q4))
  • 隨機(jī)抽樣
    通過(guò)抽樣,用其中一份構(gòu)建預(yù)測(cè)模型,使用一份驗(yàn)證模型的可靠性
mydata <- leadership[sample(1:nrow(leadership),3,replace=FALSE),]

高級(jí)數(shù)據(jù)管理

目標(biāo):

  • 數(shù)學(xué)和統(tǒng)計(jì)函數(shù)
  • 字符處理函數(shù)
  • 循環(huán)和條件執(zhí)行
  • 自編函數(shù)
  • 數(shù)據(jù)整合與重塑

基石函數(shù)

一些重要函數(shù)在《R語(yǔ)言實(shí)戰(zhàn)》(第二版)的頁(yè)碼:

  1. 數(shù)學(xué)函數(shù),P86-87
  2. 統(tǒng)計(jì)函數(shù),P87-88
  3. 概率函數(shù),P90
  4. 字符函數(shù),P93
  5. 其他實(shí)用函數(shù), P94

自編函數(shù)

除了這些基石函數(shù)外,R語(yǔ)言還支持大量的擴(kuò)展包,以及用戶自編函數(shù)用于處理某個(gè)特定的問(wèn)題

myfunction <- function(arg1,arg2,...){
    statements
    return(object)
}

可以在函數(shù)中添加控制流,如重復(fù)和循環(huán)以及條件執(zhí)行。

for (var in seq) statement
while (cond) statement
if (cond) statement
if (cond) statement1 else statement2
ifelse(cond, statement1 statement2)

這些由于不是本文的重點(diǎn),不詳細(xì)展開(kāi)。

應(yīng)用函數(shù)

如何將上述這些函數(shù)應(yīng)用(apply)到矩陣、數(shù)組、數(shù)據(jù)框的任何維度上呢?
R語(yǔ)言提供了除了循環(huán)語(yǔ)句外更好的選擇:apply,sapply,lapply
其中apply作用于相同數(shù)據(jù)類型的數(shù)據(jù)結(jié)構(gòu)(如vector,matrix,array),而sapplylapply作用與含有不同數(shù)據(jù)類型的數(shù)據(jù)結(jié)構(gòu)(如data.frame,list)

1.apply的用法
apply的一般形式:

apply(m,dimcode,f,fargs)
# m是矩陣或數(shù)組或數(shù)據(jù)框
# dimcode, 維度編號(hào),1代表行,2代表列
# f, 應(yīng)用函數(shù)
# fargs f的可選參數(shù)

例如對(duì)每列求和

set.seed(941122)
mx <- matrix(runif(50),nrow=5)
apply(mx,2,sum)

注意到還有一個(gè)fargs,在調(diào)用的函數(shù)需要多于一個(gè)參數(shù)時(shí)使用,例如如果matrix中有NA,然而mean在默認(rèn)下保留NA,有時(shí)候你需要主動(dòng)聲明。

mx[1,3] <- NA
apply(mx,2,mean)
apply(mx,2,mean,na.rm=TRUE)

如果數(shù)據(jù)庫(kù)每一列的數(shù)據(jù)類型都相同,也就可以當(dāng)做矩陣處理,以自帶mtcar數(shù)據(jù)為例

apply(mtcars,2,mean)

2.lapply和sapply
lapplysapply功能相同,區(qū)別就是lapply返回的依舊是list,而sapply返回的是vector,算是lapply的“友好版”

lst <- list(a=rnorm(6,mean=1),b=rnorm(6,mean=4),c=rnorm(6,mean=6))
lst.lapply <- lapply(lst,mean)
lst.sapply <- sapply(lst,mean)

3.mapply,vapply
還有兩個(gè)不怎么常用的apply家族成員,mapply用于處理多層嵌套的list,vapply預(yù)先定義返回的內(nèi)容,速度比較快,而且容易發(fā)現(xiàn)錯(cuò)誤。自行查閱help().

整合和重構(gòu)

整合和重構(gòu)可能是一類比較高級(jí)的數(shù)據(jù)管理了。
整合:將多組觀測(cè)替換為根據(jù)這些觀測(cè)計(jì)算的描述性統(tǒng)計(jì)量
重塑:修改數(shù)據(jù)的結(jié)構(gòu)(行和列)來(lái)決定數(shù)據(jù)的組織形式。
下面用mtcars來(lái)就具體說(shuō)明。

熱身:轉(zhuǎn)置

轉(zhuǎn)置可能是重塑數(shù)據(jù)集中最簡(jiǎn)單的啦,在Excel里面,你可以需要先選擇一部分區(qū)域,然后復(fù)制的時(shí)候選擇轉(zhuǎn)置,R里面通過(guò)t()來(lái)實(shí)現(xiàn)

cars <- mtcars[1:5,1:4]
t(cars)

整合數(shù)據(jù)

在R中可以使用一個(gè)或多個(gè)by變量和一個(gè)預(yù)先定義好的函數(shù)來(lái)折疊(collapse)數(shù)據(jù)。調(diào)用格式為:

aggregate(x,by,FUN)

實(shí)例:

options(digits=3)
attach(mtcars)
aggrata <- aggragate(mtcars,by=list(cyl,gear),FUN=mean,na.rm=TRUE)
Group.1 Group.2  mpg cyl disp  hp drat   wt qsec  vs   am gear carb
1       4       3 21.5   4  120  97 3.70 2.46 20.0 1.0 0.00    3 1.00
2       6       3 19.8   6  242 108 2.92 3.34 19.8 1.0 0.00    3 1.00
3       8       3 15.1   8  358 194 3.12 4.10 17.1 0.0 0.00    3 3.08
4       4       4 26.9   4  103  76 4.11 2.38 19.6 1.0 0.75    4 1.50
5       6       4 19.8   6  164 116 3.91 3.09 17.7 0.5 0.50    4 4.00
6       4       5 28.2   4  108 102 4.10 1.83 16.8 0.5 1.00    5 2.00
7       6       5 19.7   6  145 175 3.62 2.77 15.5 0.0 1.00    5 6.00
8       8       5 15.4   8  326 300 3.88 3.37 14.6 0.0 1.00    5 6.00

結(jié)果根據(jù)氣缸數(shù)目(group.1)和檔位數(shù)(group2)對(duì)求不同分組的平均值

強(qiáng)大無(wú)比的tidyr包

reshpe2包是一套重構(gòu)和整合數(shù)據(jù)集的絕妙的萬(wàn)能工具,而tidyr是他的繼承者。

加載到R語(yǔ)言中的表格數(shù)據(jù)有兩種類型,longwide.例如:

  • wide format
基因 分生組織
gene1 582 91 495
gene2 305 3505 33
  • long format
基因 組織 表達(dá)量
gene1 分生組織 582
gene2 分生組織 305
gene1 91
gene2 3503
gene1 492
gene2 33

一般而言我們記錄數(shù)據(jù)的格式通常是long format,但是實(shí)際上機(jī)器比較喜歡的wide format,為了讓機(jī)器能夠更好理解數(shù)據(jù),我們需要在內(nèi)部把long format 轉(zhuǎn)成 wide format. 這里用的就是tidyr。
這么牛逼好用的包是誰(shuí)開(kāi)發(fā)的呢,是Hadley Wickham!.

Hadley Wickham

tidyr使用gather()spread()來(lái)改變數(shù)據(jù)儲(chǔ)存的格式,類似于前任reshape2的melt()cast(),如下圖所示:

具體操作

  • 將wide format,轉(zhuǎn)成long format
    數(shù)據(jù):
gene <- c("gene1","gene2")
meristem <- c(582,305)
root <- c(91,3505)
flower <- c(495,33)
gene.expr <- data.frame(gene=gene,meristem=meristem,root=root,flower=flower)

用法:

gather(data, key, value, ..., na.rm = FALSE, convert = FALSE,factor_key = FALSE)

data:用于轉(zhuǎn)換的數(shù)據(jù)框,key和value分別對(duì)應(yīng)轉(zhuǎn)換后結(jié)果,...就是用于進(jìn)行轉(zhuǎn)換的列名(-A表示剔除列A,A:B,表示從A到B)。

long.format <-gather(data = gene.expr,key =  Tissue, value = Expression,meristem:flower )
   gene   Tissue Expression
1 gene1 meristem        582
2 gene2 meristem        305
3 gene1     root         91
4 gene2     root       3505
5 gene1   flower        495
6 gene2   flower         33
  • 將long format轉(zhuǎn)成wide format
    當(dāng)數(shù)據(jù)處理結(jié)束后,數(shù)據(jù)的結(jié)果畢竟是給人看,可以用spread()進(jìn)行轉(zhuǎn)換。
spread(data, key, value, fill = NA, convert = FALSE, drop = TRUE,sep = NULL)

含義同上。

spread(long.format,key=Tissue,Value=Expression)
   gene flower meristem root
1 gene1    495      582   91
2 gene2     33      305 3505

結(jié)語(yǔ)

以上是R語(yǔ)言中數(shù)據(jù)操作基本知識(shí),下一部分介紹如何利用這些基本知識(shí),進(jìn)行數(shù)據(jù)探索性分析(Exploratory Data Analysis, EDA)

參考資料:

  • [R語(yǔ)言實(shí)踐]
  • [Bioinformatics Data Skills]
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容