首先最重要的參考鏈接:

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ù)
- 還是點(diǎn)鏈接看吧! 太多太詳細(xì)了。常用函數(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,其原因就是輸入對象都是一維的。