歐劍虹老師BOOK學(xué)習(xí)記錄:第一章 R/Bioconductor入門(4):R編程

首先最重要的參考鏈接:

第一章 R/Bioconductor入門

image.png

啊啊啊,如有侵犯版權(quán), 麻煩請私信我,看到立馬刪除!

主要用來記錄自己可能要用的一些知識點(diǎn)。(基本復(fù)制粘貼,建議直達(dá)鏈接)

歐劍虹老師BOOK學(xué)習(xí)記錄:第一章 R/Bioconductor入門(1)
歐劍虹老師BOOK學(xué)習(xí)記錄:第一章 R/Bioconductor入門(2):生物字符串 Biological strings
歐劍虹老師BOOK學(xué)習(xí)記錄:第一章 R/Bioconductor入門(3):基礎(chǔ)函數(shù)繪圖

重點(diǎn)是apply家族函數(shù)的使用

通過本章你能獲得什么?

  • 常用函數(shù)
  • 請編寫一個函數(shù)并達(dá)到自己的設(shè)計(jì)要求。
  • 為什么R應(yīng)該盡量避免for循環(huán)?
  • 什么是引用類(refference class)?

常用函數(shù)

函數(shù)進(jìn)階

  • apply函數(shù)
    R語言中大家都討論的一個問題是為什么用for循環(huán)的執(zhí)行效率很低?但是有的人卻覺得并不低,如果你覺得你低,那么肯定是你寫的代碼有問題,哈哈! 主要的問題有以下幾個:
  • for循環(huán)中改變變量的長度。比如使用a <- c(a, newData)或者aList$newElement <- newData這樣的語句
  • for循環(huán)中作用非矢量思維??梢允褂檬噶克季S的操作不使用for循環(huán)來解決。比如
str1 <- ""
a <- as.character(1:1000)
system.time({
  for(i in 1:1000) str1 <- paste(str1, a[i], sep = "")
})
# 用戶 系統(tǒng) 流逝 
# 0.02 0.00 0.01 

system.time({str2 <- paste(a, collapse = "")})
# 用戶 系統(tǒng) 流逝 
#   0    0    0 

identical(str1, str2)
# [1] FALSE
  • R()也是需要花費(fèi)時間來計(jì)算的,如下:
system.time({
    for (i in 1:100000) {
        ((((((((((10))))))))))
    }
})

system.time({
    for (i in 1:100000) {
        10
    }
})

  • 如果我們需要操作的對象一定要用循環(huán)才進(jìn)行,那么怎么辦?我們可以通過化整為零來進(jìn)行(來自:The Split-Apply-Combine Strategy for Data Analysis, Hadley Wickham, Journal of Statistical Software, April 2011, V.40.)
  • 那么什么時候我們使用化整為零?
1、數(shù)據(jù)需要分組處理
2、數(shù)據(jù)需要按照每行或者每列來進(jìn)行處理
3、數(shù)據(jù)需要分級處理,和分組類似,但是分級時候需要考慮分級之間的關(guān)系。
  • 通過實(shí)例來進(jìn)一步說明。
A <- matrix(as.numeric(1:100000), nrow = 10)
  • A每一列之和,首先通過for循環(huán)實(shí)現(xiàn):
system.time({
  res <- rep(NA, ncol(A))
  for (i in 1:ncol(A)) {
    res[i] <- sum(A[, i])
  }
})

# 用戶 系統(tǒng) 流逝 
# 0.02 0.00 0.01 
  • 化整為零方法進(jìn)行實(shí)現(xiàn)
system.time({
  res2 <- apply(A, 2, sum)
})
# 用戶 系統(tǒng) 流逝 
#   0    0    0 
  • R中也可以通過函數(shù)colSums來實(shí)現(xiàn)
system.time({res3 <- colSums(A)})
  • 而在R當(dāng)中,有一系列相關(guān)的函數(shù),apply, lapply, sapply, tapply, mapply, sweep。
  • apply函數(shù)的使用格式為apply(array, margin, function, ...)。首先apply函數(shù)的對象是矩陣array(包括matrix)或者data.frame。它的第二個參數(shù)margin代表的是維度,如果你的array是一個二維矩陣,需要按照橫排的方式計(jì)算每一排的平均值,那么應(yīng)該記為1,如果是列則記為2,當(dāng)然也可以通過使用c(1,2)這樣的方式來設(shè)置第二個參數(shù),就是并行計(jì)算每一個值,第三個參數(shù)是需要使用的函數(shù)。
x <- cbind(x1 = 3, x2 = c(4:1,  2:5))
dimnames(x)[[1]] <- letters[1:8]
x
#   x1 x2
# a  3  4
# b  3  3
# c  3  2
# d  3  1
# e  3  2
# f  3  3
# g  3  4
# h  3  5

apply(x, 2, mean, trim = .2)
# x1 x2 
 # 3  3 

apply(x, 1, mean, trim =.2)
#   a   b   c   d   e   f   g   h 
# 3.5 3.0 2.5 2.0 2.5 3.0 3.5 4.0 
  • lapply(X, FUN, ...)

  • sapply(X, FUN, ..., simplify = TRUE, USE.NAMES = TRUE)

  • vapply(X, FUN, FUN.VALUE, ..., USE.NAMES = TRUE)

  • 它們沒有了apply當(dāng)中所需要的第二個參數(shù)margin,其原因就是輸入對象都是一維的。

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

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

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