一步步学R(1)

系列连载

一步步学R(1)
一步步学R(2)

嘿嘿,作为一名天才,当然要掌握一定的数据分析能力啦,所以从今天起,我们来一步步学习R这门有意思的语言。

这一系列的文章的开发环境都是基于Mac的。

安装

  1. 首先你要安装R语言的环境 安装点我
  2. 可选:安装RStudio(类似于Matlab),安装之前必须已经安装了R 安装点我

基础知识

R里面的基础类型

  • Character,如 “a”,”haha”
  • Number(实数),如 5, 5.5
  • Integer(整数),如 5,6

    要注意的是,默认情况,所有的整数类型都为实数,如果要特定为整数,需要加L,如5L

  • Logical,如TRUE, FALSE

    FALSE = 0,TRUE为一切非0数,可以简写为F/T

  • Complex(复数),如 5 + 7i

操作

x <- 5 表示将5赋值给x
x 表示输出x,效果等同于print(x)

向量

虽然向量不是一个基本类型,但是却是R语言中非常关键的一种数据结构

x <- 5 这句语句虽然表面上看起来是定义了一个Number类型的x,值为5。但是实质上却是构建了一个大小为1的向量,通过x语句我们可以得到一下结果:

> x
[1] 5

所以x 等同于语句 x[1],会输出5。

注意:R语言里面的数据索引从1开始

除了默认构造的向量以外,我们可以通过vector(class, size)来构建指定类型和大小的向量,如:

> k <- vector('logical', 5L)
> z <- vector("complex", 7)

以上两句我们分别构建了一个名为k的logical向量,大小5以及一个复数向量,大小为7。

注意:在R的向量里,同一个向量只能包含相同类型的对象,如果包含了不相同,会进行隐式转换,如果不能转换就会报错。

如:

> k <- c(T, "a")
> k
[1] "TRUE" "a" 

当然也可以强制转换:

as.characteras.logicalas.numericas.complexas.integer

list

list是一种可以同时保存多个类型对象的数据结构,通过list(a, b, c, d)进行构建。

Matrix

matrix就是多维向量,通过函数matrix(data, nrows, ncols) 构建,默认是按列排列数据,可以通过更改byrow=T来按照行来构建。

Factor

简单理解,就是分类定义的数组,比如,x <- factor(c('yes', 'no', 'yes', 'no', 'yes')) ,虽然看起来构建了一个和Character类型的向量差不多,但是实质上,我们可以通过

> x <- factor(c('yes', 'no', 'yes'))
> levels(x)
[1] "no"  "yes"

这个向量代表了几种分类。

Missing Values

Na和NaN, NaN仅代表数值计算的不存在,而Na是代表一切的不存在,即Na包含NaN
我们可以通过is.Nais.NaN来进行判断。

Data Frames

Data Frames简单理解就是一个表格,但是与Matrix不同的是,她可以包含不同类型的data,也就是说,DataFrames的每一列都是一个list

> k <- data.frame(foo = 1:3, w = c(T, F, F), row.names = c('1', 'a', 'k'))
> k
  foo     w
1   1  TRUE
a   2 FALSE
k   3 FALSE

需要注意的是,每一个list的长度,都必须完全一样

Names(别名)

对于一个向量、list或者matrix等等,我们都可以为里面的元素加上别名,如:

> x <- 1:3
> names(x) <- c(T, F, "ha")
> x
 TRUE FALSE    ha 
    1     2     3 

其中,这些别名都会以字符串的形式存在,因此,你可以通过x[“TRUE”]来访问元素1。


进阶的R 哈哈哈

Partical Matching

R里面有个很酷的特性叫做Partial Matching。比如你定义了如下的list:x <- list(caonikljslkdfj = 5),每次都要输入caonikljslkdfj势必很麻烦,因此你可以使用$来获取,如x$c 即可以得到5了。

Subset

在R里面,获取数据或者构建数据简直就是a piece of cake。(哈哈哈,英语好就是屌啊)

比如有这样一个向量x <- c(1, 2, 3, 4, 5)

你可以x[1] 来获取元素1,也可以通过x[1:3]来获取元素1到元素3。同样,你也可以通过x[x > 2] 来获取元素中值比2大的元素。

你也可以通过logical来构建另外的向量,如:

> u <- x > 2
> u
[1] FALSE FALSE  TRUE  TRUE  TRUE

而对于Matrix类型来说,c <- matrix(1:3, nrows = 3, ncols = 1),你可以使用c[1, ]来获取第一行所有列的数据,或者c[,1]来获取第一列所有行的数据。

[] vs [[]] vs $

首先,这三个符号都可以获取元素,但是区别在于:

  • []返回的是和变量本身类型相同的东西,如果对list使用[],那么返回的就是list,如果对向量使用,返回的就是向量,无关取出的元素本身的类型。
  • []可以获取多个元素,而[[]]和$不行。
  • $可以模糊匹配(Partial Matching),而[[]]不行,如果要启用模糊匹配,得使用[[name, exact = F]]
  • $不可以使用计算值,[[]]可以

是不是很拗口?让我们来看几个例子,在看例子之前强调一点,

元素并非特指一个,而是一个基本的数据结构,比如对于向量 x <- 1:5来说,里面的元素1到元素5分别都是一个元素。而对于c<- list(foo = 1:3, bar = 0.5)来说,foo和bar都分别是一个元素,尽管foo本身仍然是个向量。

例子

对于c <- list(foo = 1:3, bar = 0.6)定义的一个list,我们分别使用:

> c["foo"]
$foo
[1] 1 2 3

> c[["foo"]]
[1] 1 2 3
> c$foo
[1] 1 2 3

可以看到,通过[]取出的foo元素仍然是list,而[[]]和$取出的都是向量元素本身了。

再比如计算变量的差别:

> name <- "foo"
> c[[name]]
[1] 1 2 3
> c$name
NULL

可以看到,[[]]可以使用计算变量,而$不可以。这点其实和JavaScript里面的dot和[]操作符很类似的

模糊匹配差别:

> c$f
[1] 1 2 3
> c[["f"]]
NULL
> c[["f", exact = F]]
[1] 1 2 3

向量化操作

R里面的所有计算操作都是并行的

因此,如果要计算两个Matrix的乘积,需要使用%*%,否则如果直接使用*就是对应位置的元素相乘而已。