系列连载
嘿嘿,作为一名天才,当然要掌握一定的数据分析能力啦,所以从今天起,我们来一步步学习R这门有意思的语言。
这一系列的文章的开发环境都是基于Mac的。
安装
基础知识
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赋值给xx
表示输出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.character
, as.logical
, as.numeric
,as.complex
,as.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.Na
和is.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的乘积,需要使用%*%
,否则如果直接使用*
就是对应位置的元素相乘而已。