欧剑虹老师BOOK学习记录:第一章 R/Bioconductor入门(4):R编程

首先最重要的参考链接:

第一章 R/Bioconductor入门

image.png

啊啊啊,如有侵犯版权, 麻烦请私信我,看到立马删除!

主要用来记录自己可能要用的一些知识点。(基本复制粘贴,建议直达链接)

欧剑虹老师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,其原因就是输入对象都是一维的。

你可能感兴趣的:(欧剑虹老师BOOK学习记录:第一章 R/Bioconductor入门(4):R编程)