1. 问题
R 语言作为统计学家御用语言,数据类型和语法规则和常见的给程序员使用的编程语言多有不同。不能说人家坏,只是不适合。
就像东哥就是刘亦菲永远都得不到的人(^_−)☆。
2. 分析
先丢下咱的刘亦菲,继续聊聊 R 语言这些怪异的数据类型。下面这个表格很清楚的显示了R语言常见复合数据类型
| Homogeneous | Heterogeneous | |
|---|---|---|
| 1D | Vector | List |
| 2D | Matrix | DataFrame |
| nD | Array | / |
有些数据是单一数据类型(Homogeneous),有些是复合数据类型(Heterogeneous)。
2.1. Vector
Vector 是R里面最基础的数据类型。简单的话可以理解成一组同质数据组成的数组。 Vector 可以用c函数创建。c代表 combine,可以把多个数据合并成一个数据。例如
> avec = c(1, 2, 3)
[1] 1 2 3
Vector 可以进行集合运算。比如
> b = a+100
[1] 101 102 103
> b + a
[1] 102 104 106
2.2. Factor
Factor 可以看做 Integer Vector 加上 Label。比如
> f = factor(c('a', 'b', 'c', 'a'))
> f
[1] a b c a
Levels: a b c
> str(f)
Factor w/ 3 levels "a","b","c": 1 2 3 1
可以看出,最后的 f 是整数类型的一个 Vector,实质上是1/2/3/,但是用 Level 里面的 Label 做了标记,界面更友好。
艾玛,天知道可视化的时候 factor 帮了多大忙!
2.3. matrix
matrix 是单一类型组成的二维变量,比如
> mat = matrix(c('a', 'b', 1, 2), nrow=2)
> mat
[,1] [,2]
[1,] "a" "1"
[2,] "b" "2"
因为 a/b 是字符变量,1/2也只好委曲求全。
2.4. List
List 可以包含多种数据类型,来者不拒,摘到篮子里的都是菜。比如
> list1 = list(a = a, b= b, f = f)
> list1
$a
[1] "101" "102" "103" "python"
$b
[1] 101 102 103
$f
[1] a b c a
Levels: a b c
> list2 = list(a, b, f)
> list2
[[1]]
[1] "101" "102" "103" "python"
[[2]]
[1] 101 102 103
[[3]]
[1] a b c a
Levels: a b c
可见,指定命名就可以用$访问,否则就只能用[[]]访问。
2.5. DataFrame
DataFrame 不用多说,R 里面最常用的数据类型。可以简单的理解为Excel表格的数据库,各列可以有不同类型的数据,但列内类型必须一致。
比如
> df = data.frame(a, b, f)
> df
a b f
1 101 102 a
2 102 103 b
3 103 104 c
4 python 105 a
> class(df)
[1] "data.frame"
> class(df$a)
[1] "factor"
> class(df$b)
[1] "numeric"
> class(df$f)
[1] "factor"
3. 转换
了解了规则,就了解了转换规则。
比如,list 是 1D的,但可以包含复合类型。转换的时候最好用unlist转换成vector,再做其他考虑。
vector 性格单纯,可做多样使用。最常见的是转换成 DataFrame,比如
> dfv = data.frame(unl)
> dfv
unl
1 101
2 102
3 103
4 python
5 101
6 102
7 103
8 1
> dav = as.data.frame(unl)
> dav
unl
1 101
2 102
3 103
4 python
5 101
6 102
7 103
8 1
> dav == dfv
unl
[1,] TRUE
[2,] TRUE
[3,] TRUE
[4,] TRUE
[5,] TRUE
[6,] TRUE
[7,] TRUE
[8,] TRUE
4. 总结
今天我们大致总结了 R 的数据类型及其转换方法。虽然 R 比较怪,但仔细想想,谁又不怪呢?人群中,你我皆是异类。
就比如,东哥是刘亦菲永远都得不到的人,所以在东哥看来,刘亦菲也挺怪的。
所以,东哥和刘亦菲之间有什么故事?没有,互相 Diss 罢。
如果她能 Diss 到我的话。
5. 交流
独学而无友则孤陋寡闻。现有「数据与统计科学」微信交流群,内有数据行业资深从业人员、海外博士、硕士等,欢迎对数据科学、数据分析、机器学习、人工智能有兴趣的朋友加入,一起学习讨论。
大家可以扫描下面二维码,添加荔姐微信邀请加入,暗号:机器学习加群。
6. 扩展
6.1. 参考文献
- Dr. P. Prakash和A. S. K. Rao, R Data Structures and Algorithms. 2016.
- H. Wickham和G. Grolemund, R for data science: import, tidy, transform, visualize, and model data, First edition. Sebastopol, CA: O’Reilly, 2016.
本文使用 mdnice 排版