数据科学(二):R语言

数据科学一系列文章的内容来源于我在Coursera中的一项专项课程Data Science的笔记,其中内容除专门指出外均来自该课程课件。

Week1: Background, Getting Started, and Nuts & Bolts

Set working directory and write code

文件–改变工作目录 选择工作目录

文件–新建程序脚本 可以写代码

source()–函数名() 运行代码

 

Five basic classes of objects

  • character 字符型
  • numeric 数值型
  • integer 整型
  • complex number 复数型
  • logical 逻辑型

 

Objects

A vector can only contain objects of the same class. But the one exception is a list. Every vector function have two parameters, type and length.

数字默认为数值型,可在数字后加L 表示整数。

数值inf(infinity)表示无穷。NaN(not a number)非数值。

attributes() 设定或是修改对象的属性

列表有索引,其元素由双层括号包围。

矩阵(matrix)是具有维度的向量。

矩阵中每个元素必须储存同样类型的对象。

数据框可以存储不同类型的对象。

因子用来分类数据,可以是有序或无序的。

 

Subsetting提取子集

[]返回相同类型,选择超过一个元素。

[[]]仅可用来提取单个元素,从列表或数据框提取并且返回的一定是列表或数据框类型。

$提取有名字的列表和数据框里的一个元素。

例:

> x<-c(“a”,”b”,”c”,”c”,”d”,”a”)

> x[1]

[1] “a”

> x[2:5]

[1] “b” “c” “c” “d”

> x[x>”b”]

[1] “c” “c” “d”

> u<-x>”a”

> u

[1] FALSE  TRUE  TRUE  TRUE  TRUE FALSE

> x[u]

[1] “b” “c” “c” “d”

> x<-list(foo=1:4,bar=0.6)

> x

$foo

[1] 1 2 3 4

$bar

[1] 0.6

> x[1]

$foo

[1] 1 2 3 4 #包含数列的列表

> x[[1]]

[1] 1 2 3 4 #数列

> x[[1]]

[1] 1 2 3 4

> x$bar

[1] 0.6

> x[[“bar”]]

[1] 0.6

> x[“bar”]

$bar

[1] 0.6 #包含元素的列表

$支持模糊匹配;[[]]默认精确匹配,通过[[“”,exact=false]]可设为模糊匹配。

 

Removing NA values

> x<-c(1,2,NA,4,NA,5)

> bad<-is.na(x)

> bad

[1] FALSE FALSE  TRUE FALSE  TRUE FALSE

> x[bad]

[1] NA NA

> x[!bad]

[1] 1 2 4 5

> y<-c(“a”,”b”,NA,”d”,NA,”f”)

> good<-complete.cases(x,y)

> good

[1]  TRUE  TRUE FALSE  TRUE FALSE  TRUE

> x[good]

[1] 1 2 4 5

> y[good]

[1] “a” “b” “d” “f”

 

Swirl

http://swirlstats.com/

install.packages(“swirl”)

library(swirl)

swirl()

 

 

Week2: Programming with R

Control structures

if-else 测试逻辑条件

for 执行固定次数的循环

while 在某条件成立时执行循环

repeat 直接执行无限循环

break 终止并跳出循环

next 跳过循环中的当前迭代

return 用于从函数中退出

 

Scoping rules作用域规则

全局环境等同于工作区,是排在搜索列表第一位的元素。base包总是排在最后一位。

如果无法在当前函数中找到自由变量的值,那么将在全局环境中搜索。进而在全局环境的父环境中搜索。直到顶层环境。

其他使用作用域的语言:Scheme,Perl,Python,Common Lisp(all language converge to Lisp)。

 

Coding standards

  • 用文本编辑器编辑代码,并保存在文本文件中。
  • 缩进代码。
  • 限制代码宽度。
  • 限制单个函数的长度(功能)。

 

 

Week3: Loop Functions and Debugging

Looping functions

  • lapply 使循环在对象列表里发生,并对列表里的每一个元素运用函数。lapply中任何对象都会被强制转化成一个列表,因此其返回值总是一个列表。

> x<-list(a=matrix(1:4,2,2),b=matrix(1:6,3,2))

> x

$a

[,1] [,2]

[1,]    1    3

[2,]    2    4

$b

[,1] [,2]

[1,]    1    4

[2,]    2    5

[3,]    3    6

> lapply(x,function(elt)elt[,1])

$a

[1] 1 2

$b

[1] 1 2 3

  • sapply Same as lapply but try to simplify the result. 如果结果是一个每个元素长度都为1的列表,将返回一个包含所有元素的向量。如果结果是每个元素都为等长且大于1的向量的列表,将返回一个矩阵。当sapply不知道将要返回何种类型的对象时,将返回列表。
  • apply 对数组进行行或列运算。

> x<-matrix(rnorm(200),20,10)

> apply(x,2,mean)

[1]  0.202710797  0.657586397  0.311566385 -0.576431006  0.071242105

[6] -0.079655142 -0.088152958  0.265094589 -0.080316387 -0.004105807

> apply(x,1,mean)

[1] -0.03455920  0.32109360  0.14377951 -0.47814506  0.22334693  0.18483565

[7] -0.48443956 -0.07934518 -0.05040694  0.53379001  0.58542988  0.84064415

[13]  0.22982523  0.03535808 -0.32222251 -0.01364540  0.31635857  0.01712182

[19] -0.28740459 -0.32233705

> apply(x,1,sum)

[1] -0.3455920  3.2109360  1.4377951 -4.7814506  2.2334693  1.8483565

[7] -4.8443956 -0.7934518 -0.5040694  5.3379001  5.8542988  8.4064415

[13]  2.2982523  0.3535808 -3.2222251 -0.1364540  3.1635857  0.1712182

[19] -2.8740459 -3.2233705

  • tapply 将函数运用于向量的子集
  • mapply lapply的多变量版本

> list(rep(1,4),rep(2,3),rep(3,2),rep(4,1)) =mapply(rep,1:4,4:1)

[[1]]

[1] 1 1 1 1

[[2]]

[1] 2 2 2

[[3]]

[1] 3 3

[[4]]

[1] 4

 

Debugging tools in R

  • traceback 在错误发生后输出函数调用栈(一共调用了多少个函数,以及错误发生在哪里),无错误则不做任何事。
  • debug 将传递给它的函数标记进入调试模式。每当执行这个函数时,暂停在此函数的第一行。
  • browser 能在函数的任何位置暂停运行,并将函数进入调试模式。
  • trace 允许在函数中插入调试代码。
  • recover 无论函数在什么地方遇到错误,R会停止执行,但不会直接回到控制台。

 

 

Week4: Simulation & Profiling

The str function

str: Compactly display the internal structure of an R object.

A diagnostic function and an alternative to ‘summary’.

It is especially well suited to compactly display the (abbreviated) contents of (possibly nested) lists.

Roughly one line per basic object.

 

Simulation

  • Probability distribution function usually have four functions associated with:

d for density. 密度

r for random number generation. 随机数字生成

p for cumulative distribution. 累计分配

q for quantile function. 分位数函数

  • Always set the random number seed when conducting a simulation: set.seed()

> set.seed(1)

> rnorm(5)

[1] -0.6264538  0.1836433 -0.8356286  1.5952808  0.3295078

> rnorm(5)

[1] -0.8204684  0.4874291  0.7383247  0.5757814 -0.3053884

> set.seed(1)

> rnorm(5)

[1] -0.6264538  0.1836433 -0.8356286  1.5952808  0.3295078

  • sample()从给定的一组对象中随机抽取样本。

> sample(1:10,4)

[1] 9 8 2 3

> sample(1:10,4)

[1]  1 10  3  9

> sample(1:10)

[1]  5  6  4  9 10  7  1  3  8  2

> sample(1:10,replace=TRUE)

[1]  1  7  6  7  4  6  9  6 10  4

 

Profiler: profiling R code

Rprof() 启动R中的分析器。

summaryRprof() 取出分析器结果。

不可同时使用system.time()和Rprof().