R中的数据结构主要面向《线性代数》中的一些概念,如向量、矩阵等。值得注意的是,R中其实没有简单数据(数值型、逻辑型、字符型等),对于简单类型会自动看做长度为1的向量。比如:

  1. > b=5
  2. > length(b)
  3. [1] 1
  4. > typeof(b)
  5. [1] "double"
  6. > mode(b)
  7. [1] "numeric"

R中最重要的数据结构是向量(vector)和矩阵(matrix)。

向量由一系列类型相同的有序元素构成;矩阵是数组(array)的一个特例:维数为2的数组;而数组又是增加了维度(dim)属性的向量。

除此之外,列表(list)和数据框(data frame)分别是向量和矩阵的泛化——列表允许包含不同类型的元素,甚至可以把对象作为元素;数据框允许每列使用不同类型的元素。对于列表和数据框,其中的元素通常称为分量(components)。

对象的类型和长度

R中所有的对象都有类型和长度属性,可以通过函数typeof()和length()获取/设置。举例如下:

  1.  
  2. > x = c(1,2,3,4)
  3. > x
  4. [1] 1 2 3 4
  5. > typeof(x)
  6. [1] "double"
  7. > length(x)
  8. [1] 4
  9. > dim(x)=c(2,2)
  10. > x
  11. [,1] [,2]
  12. [1,] 1 3
  13. [2,] 2 4
  14. > typeof(x)
  15. [1] "double"
  16. > length(x)
  17. [1] 4
  18.  
  19. > Lst <- list(name="Fred", wife="Mary", no.children=3,
  20. + child.ages=c(4,7,9))
  21. >
  22. > Lst
  23. $name
  24. [1] "Fred"
  25.  
  26. $wife
  27. [1] "Mary"
  28.  
  29. $no.children
  30. [1] 3
  31.  
  32. $child.ages
  33. [1] 4 7 9
  34.  
  35. > typeof(Lst)
  36. [1] "list"
  37. > length(Lst)
  38. [1] 4

typeof()函数可能返回如下的值(在R源代码src/main/util.c的TypeTable中定义):

# 数据对象
logical        含逻辑值的向量
integer        含整数值的向量
double        含实数值的向量
complex        含复数值的向量
character    含字符值的向量
raw            含字节值的向量

# 其他对象
list        列表
NULL        空
closure        函数
special        不可针对参数求值的内置函数
builtin        可针对参数求值的内置函数
environment    环境

# 通常在R内部使用
symbol        变量名
pairlist    成对列表对象
promise        用于实现悠闲赋值的对象
language     R 语言构建
...            特定变量长度参数
any            可以匹配任何类型的特殊类型
expression    表达式对象
externalptr    外表指针对象
weakref        弱引用对象
char            字符
bytecode        二进制

对象的类型不是一成不变的,可以随时进行转换。接着上面的例子:

  1. > typeof(x)
  2. [1] "double"
  3. > y = as.logical(x)
  4. > typeof(y)
  5. [1] "logical"
  6. 转换的规则如下表:
  7. |----| | to numeric | to logical | to character
  8. |---+---
  9. from numeric - |0 FALSE 其它数字 TRUE | 1, 2, ... "", ""
  10. from logical FALSE 0 TRUE 1 |- | TRUE "TRUE" FALSE "FALSE"
  11. from character "", "", ... 1, 2, ... "A",... NA | "FALSE", "F" FALSE "TRUE", "T" TRUE 其它 NA |

对象的长度也可以随时发生改变,常见的包括如下情况:

  1. > # 扩大索引范围
  2. > x = c(1,2,3)
  3. > x
  4. [1] 1 2 3
  5. > x[5] = 12
  6. > x
  7. [1] 1 2 3 NA 12
  8. > length(x)
  9. [1] 5
  10. > # 直接设置length属性
  11. > length(x) = 2
  12. > x
  13. [1] 1 2
  14. > # 重新赋值(略)
  15. 对象的classattributes
  16. typeof()处理对象内元素的类型,而class()处理对象本身的类,例如:
  17. > x = 1:6
  18. > x
  19. [1] 1 2 3 4 5 6
  20. > typeof(x)
  21. [1] "integer"
  22. > class(x)
  23. [1] "integer"
  24. > dim(x) = c(3,2)
  25. > x
  26. [,1] [,2]
  27. [1,] 1 4
  28. [2,] 2 5
  29. [3,] 3 6
  30. > typeof(x)
  31. [1] "integer"
  32. > class(x)
  33. [1] "matrix"

通过class还可以更改对象的类,例如:

  1. > x = 1:6
  2. > class(x)
  3. [1] "integer"
  4. > class(x) = "matrix"
  5. 错误于class(x) = "matrix" :
  6. 除非维度的长度为二(目前是0),否则不能设为矩阵类别
  7. > class(x) = "logical"
  8. > x
  9. [1] TRUE TRUE TRUE TRUE TRUE TRUE

除了typeof和length之外,其他class的对象可能还会有其他的属性,可以通过函数attributes()和attr()进行操作,例如:

  1. > x = 1:6
  2. > attributes(x)
  3. NULL
  4. > dim(x) = c(3,2)
  5. > attributes(x)
  6. $dim
  7. [1] 3 2
  8.  
  9. > x
  10. [,1] [,2]
  11. [1,] 1 4
  12. [2,] 2 5
  13. [3,] 3 6
  14. > attr(x,"dim") = c(2,3)
  15. > x
  16. [,1] [,2] [,3]
  17. [1,] 1 3 5
  18. [2,] 2 4 6

从例子可以看出,属性以列表形式保存,其中所有元素都有名字。
从例子还可以看出,R的数组中,元素的排列顺序是第一下标变化最快,最后下标变化最慢。这在FORTRAN中叫做“ 按列次序”。

一些常见的属性如下:
names,可以为向量或列表的每个元素增加标签。

  1. > x = 1:6
  2. > x
  3. [1] 1 2 3 4 5 6
  4. > attributes(x)
  5. NULL
  6.  
  7. > attr(x,'names') = c('a','b','c')
  8. > x
  9. a b c <NA> <NA> <NA>
  10. 1 2 3 4 5 6
  11. > attributes(x)
  12. $names
  13. [1] "a" "b" "c" NA NA NA

dim,标记对象的维度。除向量外,基于数组的对象都会有一个维度属性,是一个指定数组各维度长度的整数向量。与下标类似,维度也可以命名。通过dimnames属性可以实现这一目的:

  1. > x = array(1:6,2:3)
  2. > x
  3. [,1] [,2] [,3]
  4. [1,] 1 3 5
  5. [2,] 2 4 6
  6. > attributes(x)
  7. $dim
  8. [1] 2 3
  9.  
  10. > names = list(c('x','y'),c('a','b','c'))
  11. > dimnames(x) = names
  12. > x
  13. a b c
  14. x 1 3 5
  15. y 2 4 6
  16. > attributes(x)
  17. $dim
  18. [1] 2 3
  19.  
  20. $dimnames
  21. $dimnames[[1]]
  22. [1] "x" "y"
  23.  
  24. $dimnames[[2]]
  25. [1] "a" "b" "c"

访问对象中的元素

既然对象是元素的集合,很自然就会想到使用下标来访问对象中的元素:

  1. > x = array(6:1,2:3)
  2. > x
  3. [,1] [,2] [,3]
  4. [1,] 6 4 2
  5. [2,] 5 3 1
  6. > x[1] #按照存储的顺序访问单个元素
  7. [1] 6
  8. > x[2] #按照存储的顺序访问单个元素
  9. [1] 5
  10. > x[3] #按照存储的顺序访问单个元素
  11. [1] 4
  12. > x[1,2] #通过多个下标访问单个元素
  13. [1] 4
  14. > x[1,] #返回一行
  15. [1] 6 4 2
  16. > x[,1] #返回一列
  17. [1] 6 5

如果对象有names属性,还可以通过names进行索引:

  1. > x = array(6:1,2:3)
  2. >
  3. > names(x) = c('a','b','c')
  4. > x
  5. [,1] [,2] [,3]
  6. [1,] 6 4 2
  7. [2,] 5 3 1
  8. attr(,"names")
  9. [1] "a" "b" "c" NA NA NA
  10. > x['b'] #等价于x[2]
  11. b
  12. 5

上面两个例子都是返回对象中的单个元素。在R中,还可以返回对象的多个元素,此时使用的索引不是简单的数值或字符串,而是一个向量。继续上面的例子:

  1. > x[1:3]
  2. a b c
  3. 6 5 4
  4. > x[c(3,4)]
  5. c <NA>
  6. 4 3
  7. > x[c(1,2),c(1,2)]
  8. [,1] [,2]
  9. [1,] 6 4
  10. [2,] 5 3
  11. > x[c('a','b')]
  12. a b
  13. 6 5

用序列填充对象

前面的例子中,你可能会注意到一些与python类似的语法,比如序列:
a:b
R中提供了一些创建序列的方法,可以很方便的填充对象。包括规则序列和随机序列。

规则序列用于产生有规则的序列:
使用a:b的形式是最简单的用法;
如果需要更多的控制,可以使用seq(from,to,by,length,along)函数;
使用rep()函数可以产生重复的元素。
例如:

  1. > 1:3
  2. [1] 1 2 3
  3. > 2*1:3
  4. [1] 2 4 6
  5. > 3:1
  6. [1] 3 2 1
  7.  
  8. > seq(1,2,0.2)
  9. [1] 1.0 1.2 1.4 1.6 1.8 2.0
  10. > seq(1,2,0.3)
  11. [1] 1.0 1.3 1.6 1.9
  12. > seq(to=2,by=.2)
  13. [1] 1.0 1.2 1.4 1.6 1.8 2.0
  14. > seq(to=2,by=.2,length=3)
  15. [1] 1.6 1.8 2.0
  16.  
  17. > rep(1:3,2)
  18. [1] 1 2 3 1 2 3
  19. > rep(1:3,each=2)
  20. [1] 1 1 2 2 3 3

随机序列用于产生符合一定分布规则的数据。有大量的函数用于产生随机序列,这里只列出一些函数的名称:

数据编辑器

我们当然可以使用下标操作对象,编辑对象中的数据元素。但是R提供的一个可视化的工具能够带来更多的便利,这就是数据编辑器。
使用data.entry()函数可以打开数据编辑器:

  1. > x = array(6:1,2:3)
  2. > data.entry(x)

(2)R中的数据类型和数据结构的更多相关文章

  1. 内核开发知识第一讲.内核中的数据类型.重要数据结构.常用内核API函数.

    一丶内核中的数据类型 在内核中.程序的编写不能简单的用基本数据类型了. 因为操作系统不同.很有可能造成数据类型的长度不一.而产生重大问题.所以在内核中. 数据类型都一定重定义了. 数据类型 重定义数据 ...

  2. Python中的数据类型和数据结构

    一.数据类型 Python中有六个标准数据类型: Number(数字) String(字符串) List(列表) Tuple(元组) Sets(集合) Dictionary(字典) 其中,除列表Lis ...

  3. R语言数据类型与数据结构

    一.数据类型 5种 1.character 字符 2.numeric 数值 3.integer 整数 一般数字的存储会默认为数值类型,如果要强调是整数,需要在变量值后面加上 L. x <- 5L ...

  4. R语言编程艺术(2)R中的数据结构

    本文对应<R语言编程艺术>第2章:向量:第3章:矩阵和数组:第4章:列表:第5章:数据框:第6章:因子和表 ======================================== ...

  5. R语言中的几种数据结构

    R语言中的几种数据结构 一  R中对象的5种基本类型 字符(character) 整数 (integer) 复数(complex) 逻辑(logical:True/False) 数值(numeric: ...

  6. 关于R中的mode()和class()的区别

    本文原创,转载请注明出处,本人Q1273314690(交流学习) 说明:本文曾经在15年11月在CSDN发过,但是由于CSDN不支持为知笔记的发布为博客的API功能,所以,自今天起,转移到博客园(幸好 ...

  7. python学习第六讲,python中的数据类型,列表,元祖,字典,之列表使用与介绍

    目录 python学习第六讲,python中的数据类型,列表,元祖,字典,之列表使用与介绍. 二丶列表,其它语言称为数组 1.列表的定义,以及语法 2.列表的使用,以及常用方法. 3.列表的常用操作 ...

  8. R语言入门 :基本数据结构

    1.向量 向量是R语言中最基本的数据类型,在R语言中没有单独的变量. (1)  创建向量 R语言中可以用 = 或者 <- 来赋值. 向量名 <- 向量 或  向量名 = 向量 向量的创建方 ...

  9. R in Action(1) 基本数据结构

    一数据类型 R的数据类型包括数值型.字符型.逻辑型(布尔).复数型和原生型,同时R有好多存储数据的对象类型,包括标量.向量.矩阵.数组.数据框和列表,如下图所示下图(图的版权神马的归原作者跟原出版社所 ...

随机推荐

  1. Navicat for MySQL使用手记(上)--创建数据库和表

    在管理MySQL数据库的图形化工具中,最为熟知的就是phpMyAdmin和Mysql-Front了,今天跟大家分享另外一个管理mysql数据库的另外一个利器---Navicat MySQL. Navi ...

  2. day7_直播_网络编程篇(元昊老师著)

    网络编程篇计算机网络: 多台独立的计算机用网络通信设备连接起来的网络.实现资源共享和数据传递. 比如,我们之前的学过的知识可以将D盘的一个文件传到C盘,但如果你想从你的电脑传一个文件到我的电脑上目前是 ...

  3. Spring装配Bean的过程补充

    对上一篇的<Spring装配Bean的过程>的过程说一下,不然真产生了误区. 误区在哪里呢?那就是spring bean的作用域问题. 说哈常用的两种作用域:默认是scope = sing ...

  4. Python 数据类型:字符串

    一.字符串介绍 字符串是由单引号/双引号/三引号引起来的,由字母 .数字或符号等构成的一串字符 In [1]: name = "Tom" # 定义字符串 In [2]: type( ...

  5. Java的String详解

    Java的String详解 博客分类: Java javaStringString详解常用方法  Java的String类在开发时经常都会被使用到,由此可见String的重要性.经过这次认真仔细的学习 ...

  6. (转)淘淘商城系列——中文分析器IK-Analyzer的使用

    在Solr中默认是没有中文分析器的,需要手工配置,配置一个FieldType,在FieldType中指定使用的中文分析器.另外,Solr中的字段(即业务域)必须先定义后使用.下面我们先把中文分析器配好 ...

  7. Objective-c官方文档翻译 类的定义

     类是对象的蓝图. 一个类是描述了对象的行为和属性.例如NSString的一个实例.他的类提供了各种的方法来转化和表示他的内部字符的表示.   每个类的实例都包含了这个类的属性和行为.例如每个NSSt ...

  8. Thinkphp 图形验证码无法显示

    不显示验证码的代码: public function verify(){ $verify = new \Think\Verify(); $verify->entry(); } 修改为: publ ...

  9. 广义表操作 (ava实现)——广义表深度、广义表长度、打印广义表信息

    广义表是对线性表的扩展——线性表存储的所有的数据都是原子的(一个数或者不可分割的结构),且所有的数据类型相同.而广义表是允许线性表容纳自身结构的数据结构. 广义表定义: 广义表是由n个元素组成的序列: ...

  10. eclipse中切换jdk版本

    安装了jdk1.8,但是项目使用的是jdk1.7,需要更改eclipse中的jdk版本 右键项目propeties  ---  Project facets