首先最重要的参考链接:

啊啊啊,如有侵犯版权, 麻烦请私信我,看到立马删除!
主要用来记录自己可能要用的一些知识点。(基本复制粘贴,建议直达链接)
欧剑虹老师BOOK学习记录:第一章 R/Bioconductor入门(1)
欧剑虹老师BOOK学习记录:第一章 R/Bioconductor入门(2):生物字符串 Biological strings
欧剑虹老师BOOK学习记录:第一章 R/Bioconductor入门(3):基础函数绘图
重点是apply
家族函数的使用
通过本章你能获得什么?
- 常用函数
- 请编写一个函数并达到自己的设计要求。
- 为什么R应该尽量避免for循环?
- 什么是引用类(refference class)?
常用函数
- 还是点链接看吧! 太多太详细了。常用函数
函数进阶
-
apply函数
:
R语言中大家都讨论的一个问题是为什么用for
循环的执行效率很低?但是有的人却觉得并不低,如果你觉得你低,那么肯定是你写的代码有问题,哈哈! 主要的问题有以下几个: - 在
for
循环中改变变量的长度。比如使用a <- c(a, newData)
或者aList$newElement <- newData
这样的语句 - 在
for
循环中作用非矢量思维。可以使用矢量思维的操作不使用for循环来解决。比如
str1 <- ""
a <- as.character(1:1000)
system.time({
for(i in 1:1000) str1 <- paste(str1, a[i], sep = "")
})
# 用户 系统 流逝
# 0.02 0.00 0.01
system.time({str2 <- paste(a, collapse = "")})
# 用户 系统 流逝
# 0 0 0
identical(str1, str2)
# [1] FALSE
- 在
R
中()
也是需要花费时间来计算的,如下:
system.time({
for (i in 1:100000) {
((((((((((10))))))))))
}
})
system.time({
for (i in 1:100000) {
10
}
})
- 如果我们需要操作的对象一定要用循环才进行,那么怎么办?我们可以通过
化整为零
来进行(来自:The Split-Apply-Combine Strategy for Data Analysis, Hadley Wickham, Journal of Statistical Software, April 2011, V.40.) - 那么什么时候我们使用
化整为零
?
1、数据需要分组处理
2、数据需要按照每行或者每列来进行处理
3、数据需要分级处理,和分组类似,但是分级时候需要考虑分级之间的关系。
- 通过实例来进一步说明。
A <- matrix(as.numeric(1:100000), nrow = 10)
- 求
A
每一列之和,首先通过for
循环实现:
system.time({
res <- rep(NA, ncol(A))
for (i in 1:ncol(A)) {
res[i] <- sum(A[, i])
}
})
# 用户 系统 流逝
# 0.02 0.00 0.01
-
化整为零
方法进行实现
system.time({
res2 <- apply(A, 2, sum)
})
# 用户 系统 流逝
# 0 0 0
- R中也可以通过函数
colSums
来实现
system.time({res3 <- colSums(A)})
- 而在R当中,有一系列相关的函数,
apply, lapply, sapply, tapply, mapply, sweep
。 -
apply
函数的使用格式为apply(array, margin, function, ...)
。首先apply
函数的对象是矩阵array
(包括matrix
)或者data.frame
。它的第二个参数margin
代表的是维度,如果你的array
是一个二维矩阵,需要按照横排的方式计算每一排的平均值,那么应该记为1
,如果是列则记为2
,当然也可以通过使用c(1,2)
这样的方式来设置第二个参数,就是并行计算每一个值,第三个参数是需要使用的函数。
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
当中所需要的第二个参数margin
,其原因就是输入对象都是一维
的。
网友评论