R是向量化的语言,最突出的特点是对向量的运算不需要显式编写循环语句,它会自动地应用于向量的每一个元素。对象是R中存储数据的数据结构,存储在内存中,通过名称或符号访问。对象的名称由大小写字母、数字0-9、点号和下划线组成,名称是区分大小写的,并且不能以数字开头,特殊的对象名称可以通过界定符 `` 来转为合法的对象名称,注意,点号( . ) 被视为没有特殊含义的单字符。

R语言非常灵活,例如:

  • R语言区分大小写,不管是变量名和函数名,都是大小写敏感的。
  • 直接给变量赋值,R中不能显式声明变量和类型;
  • 变量的类是可变的,就是说,同一个变量可以存储字符,也可以存储日期和时间,也可以存储数值。
  • R语句的分隔符是分号“;”,或换行符,当语句结束时,可以不使用分号“;”,R语言会自动识别语句结束的位置。
  • R语言只支持单行注释,注释由符号#开头,当前行出现在#之后的任何文本都会被R解释器忽略。
  • R支持向量化运算

R语言拥有强大的数据处理和绘图功能,还是免费的,是数据分析人员必学必会的一门语言。

一,变量是什么样子?

首先,我们学习变量的用法,变量用于临时存储数据,以便重用。在R语言中,变量可以直接赋值,跟C、Java等语言不同,R的变量不能声明,因为R没有这个概念。变量名是大小写敏感的,变量名可以包含字符、数字、和下划线,对于包含特殊字符的变量名,需要使用 `` 把名称转换位有效的变量名,例如:

dataset$`#Visitors (T3M)`

用户可以使用make.names() 获得一个有效的变量名。为变量赋值的操作符是:<- 或 =,建议使用<- 作为变量的赋值符号,以下代码为变量v赋值,并输出变量的值:

> v<-
> v
[]

注意,输出结果[1],表明从变量的第一个元素开始显示,这意味着,变量实际上是一个向量,R语言中不存在标量类型,最小的数据类型是向量,而向量是一系列有序的值。R按照序列的顺序,逐个打印向量的各个元素。

函数print用于输出变量的值,在控制台中,可以直接输入变量名,控制台自动调用print函数打印变量的值。

如果想把赋值和打印处于写在同一行中,可以把赋值语句写在()中,这样,就能在同一行中完成变量的赋值和打印:

>(v<-)
[]

1,变量的常用通用类

R中所有的变量都属于特定的类(class),类用于表示变量属于的类型(type),可以认为类(class)和类型(type)相同,常用的通用类是:

  • 数值integernumeric
  • 字符character,使用单引号或双引号
  • 日期和时间:日期的类型是Date,时间是POSIXctPOSIXt
  • 逻辑logical,有效值是:TRUEFALSE

用户可以通过class(variable)函数查看变量的类型:

> v <- :
> v
[]
> class(v)
[] "integer"

变量可以存储任何数据类型,也可以存储任何数据对象,例如,函数,分析的结果以及一个图形。单个变量在某时刻取值为一个数字,而后可以被赋值为字符,还可以被赋值为其他数据类型。

2,变量的类检查和类转换

通过is.* 函数检查变量的类型,通过as.*函数转换变量的类型

> vc <- c('','','')
> is.character(vc)
[] TRUE
> vi <- as.integer(vc)
> is.integer(vi)
[] TRUE

3,变量的删除

在R中,创建变量会占用系统的存储空间,而删除变量会释放存储空间;为了确保存储空间的及时释放,可以使用gc函数,强制系统回收垃圾,释放操作系统中不再使用的存储空间,R也会自动周期性地执行垃圾回收。使用rm函数把变量从当前的作用域中删除:

> rm(variable)
> gc()

4,NULL值和NA值

NULL是个特殊值,表示未知值,NA表示缺失值,NULL和NA之间最大的区别是:NA是一个标量值,长度为1,而NULL不会占用任何空间,长度为零:

> length(NA)
[1] 1
> length(NULL)
[1] 0

使用is.null函数验证NULL值,使用is.na函数验证NA值:

> is.null(NULL)
[1] TRUE
> is.na(NA)
[1] TRUE

二,向量

向量是R语言中最基本的数据结构,向量是有序的数据序列,序列中的每一个数据项叫做向量的一个元素,同一个向量的元素的数据类型必须是相同的,同一个向量中无法混杂多种不同类型的元素,向量元素可以是数值,字符,逻辑值等。

1,向量的创建

向量(Vector,也叫矢量)是数据的有序序列。函数c把一系列的数据拼接起来,创建一个向量;也可以通过c函数和冒号操作符,创建向量,例如:

> c(,,,)
[]
> c(:)
[]

也可以通过vector(class,length)函数,创建指定类和长度的向量,向量的每个元素的值是指定类型的默认值,对于数值是0,对于逻辑类是FALSE,对于字符类是空字符串,或NULL。

> vector('integer',)
[]

R为每个类型都包装了一个创建向量的函数,格式是class_name(length),例如:

> numeric()
[]

2,向量的长度

向量的长度,就是向量包含的元素的个数,通过length函数获取向量的长度

> length(c(:))
[]

3,为向量的各个元素命名

R能够为向量的各个元素命名,元素的命名有两种模式,第一种模式是在创建向量时为元素命名,第二种模式是通过names函数为元素命名:

> (v <- c(a=,b=,c=))
a b c > names(v)<- c('va','vb','vc')
va vb vc

输出的结果中,并没有[1],这说明,无名的向量是按照序列的顺序输出的。names()函数也能获得向量元素的名称,如果向量中没有一个元素有名字,那么names()函数返回NULL。

三,序列

特别地,对于正整数序列,可以使用冒号 : 操作符,该操作符能够产生一个序列,例如 n:m,用于创建从数值n开始,步长为1,依次递增,到数值m结束的有序的数值序列:

> :
[]

R内置seq函数家族,用于创建整数序列。seq函数用于创建序列,参数分别是开始值(from),结束值(to),步长(by),例如:

seq(from = , to = , by=step)

seq.int是seq函数的包装,步长不为1的数值序列,可以通过seq.int函数来实现,该函数有三个参数,第一个参数是序列的开始值,第二个参数是序列的结束值,第三个参数默认值是1,用于指定步长。

> seq.int(,,)
[]

函数seq_len(n) 用于创建长度为n的序列,相当于设置seq.int函数的:开始(from)为1,步长(by)为1,终止值(to)为n:

seq_len()
[]

四,索引向量

向量没有维数,这意味着没有列向量或行向量之分。通常情况下,通过下标和[]的组合来访问向量中特定位置的元素,索引向量的格式是v[n],n 叫做向量的下标,下标是向量元素的位置,第一个元素的位置是1,依次加1。如果下表超出向量的长度范围,不会导致错误,但是向量会返回缺失值(NA);如果不设置任何下标,那么将返回整个向量的值,R会按照元素在向量中的位置,顺序打印出向量的元素值。除了下标和[] 之外,R还提供其他方式来访问向量的元素:元素名称、逻辑向量。

1,下标为整数或整数向量

当n值为正整数时,返回特定位置的元素的值;当n值为负整数时,不返回特定位置的元素的值;当n值为整数向量时,返回特定位置的元素。

> v <- :
> v[]
[]
> v[-]
[]

v[-1]和 v[c(2:3)]返回的元素相同。

2,下标为逻辑向量

当n值为逻辑向量时,返回位置为true的元素的值;

> v[v<=]
[]

v[v<=2]和v[c(TRUE,TRUE,FALSE)]返回的元素相同。

3,下标为字符或字符向量

对于元素被命名的命名向量,给向量传入字符向量,命名向量返回指定名字的元素值;

> v <-(a=,b=,c=)
> v[c('a','b')]
a b

五,向量元素的位置

向量中包含一系列的数据,如何选择向量中符合条件的元素呢?在上节中,可以通过多种方式来索引向量的元素,如果知道符合条件的元素的位置,那么R就可以使用位置来索引向量的元素值。

1,which函数

which函数用于返回逻辑向量中元素值为TRUE的位置,

> v <- c(,,,)
> v>
[] FALSE TRUE TRUE FALSE
> which(v>)
[]
> v[which(v>)]
[]

2,逻辑向量

最简单的方式是使用逻辑向量来索引向量的元素

> v[v>]
[]

六,向量的循环

R支持向量化运算,这意味着,运算符或函数能够作用于向量中的每个元素,而无需显式地编写循环语句,这种内置的循环,用于对向量的各个元素执行计算,性能是非常高的。

1,向量和单个数值相加

向量和单个数值n相加,是把向量的每个元素都和单个数值n相加,返回的结果是向量:

> x<-c(1:3)
> x+1
[1] 2 3 4

2,向量和向量相加

向量和向量相加的逻辑是在相同的序列位置上,对两个向量的元素相加,返回的结果是向量。在向量和向量做运算时,尽量使两个向量具有相同的长度(length):

> a=:
> b=:
> a+b
[]

当两个向量的长度不同时,R会循环短的向量,以配合较长的向量。如果长向量不是短向量的整数倍,R将抛出警告消息。推荐的做法是:对长度相同的两个向量做运算。

七,向量元素的追加,删除和更新

可以向向量中追加元素,例如,向矢量的末尾追加一个元素:

> r <- c(1,3,4)
> r[4] <- 5
> r
[1] 1 3 4 5

向量不能直接删除特定位置的元素,但是,我们可以通过为向量重新赋值来实现:

> r <- r[r!=4]
> r
[1] 1 3 5

更新向量特定位置的元素值,只需要为向量的指定元素赋予新值:

> r[3] <- 4
> r
[1] 1 3 4

八,向量的排序和排名

排序:使用sort函数对向量进行排序,order函数返回元素在排序之后的位置,v[order(v)]返回和sort(v)相同的结果:

> v <- c(,,,,)
> sort(v)
[]
> order(v)
[]
> v[order(v)]
[]

排名:rank函数为数据框中的每个元素进行排名,不过rank函数只能作用于向量,只能返回向量元素的排名:

rank(x, na.last = TRUE,
ties.method = c("average", "first", "last", "random", "max", "min"))

参考文档:

Quick-R

Utility1:Overview的更多相关文章

  1. PULPino datasheet中文翻译并给了部分论文注释(前四章:Overview、Memory Map、CPU Core、Advanced Debug Unit)

    参考: (1).PULPino datasheet:https://github.com/pulp-platform/pulpino/blob/master/doc/datasheet/datashe ...

  2. [摘录]quarts :overview

    最近项目用了quarts 这个 任务调度器.今天开始详细的学习学习.参考链接:http://www.quartz-scheduler.org/# Quartz Enterprise Job Sched ...

  3. Spring 4.3.11.RELEASE文档阅读(一):overview

    一.宏观概述中的体会和发现 Spring是组件式的框架,它允许我们只使用其一小部分.Spring所做的工作,就是不断的简化我们的操作.比如它的IOC容器,当我们自己应用设计模式,比如说:建造者.工厂. ...

  4. Andrew NG 自动化所演讲(20140707):DeepLearning Overview and Trends

    出处 以下内容转载于 网友 Fiona Duan,感谢作者分享 (原作的图片显示有问题,所以我从别处找了一些附上,小伙伴们可以看看).最近越来越觉得人工智能,深度学习是一个很好的发展方向,应该也是未来 ...

  5. Chrome 开发者工具详解(4):Profiles 面板

    概述 当前使用的Chrome最新版为54.0.2840.71,这个版本的Profiles面板比之前提供的功能更多也更强大,下面是该面板所包含的功能点: Record JavaScript CPU Pr ...

  6. .Net程序员学用Oracle系列(7):视图、函数、存储过程、包

    1.视图 1.1.创建.删除及调用普通视图 1.2.高级视图介绍 2.函数 2.1.系统函数介绍 2.2.创建.删除及调用自定义函数 3.存储过程 3.1.创建.修改及删除存储过程 3.2.调用存储过 ...

  7. <Mastering KVM Virtualization>:第四章 使用libvirt创建你的第一台虚拟机

    在第3章<搭建独立的KVM虚拟化>中,你安装并启动了libvirtd服务.你还引入了帮助你管理虚拟机的libvirt管理工具virt-manager和virsh. 相较于命令行,新用户总是 ...

  8. 房上的猫:JavaDoc注释

    //这是一个注释 /*   *这是一个演示程序   */ /**    *@这是JavaDoc注释.   */ JavaDoc注释 背景: javadoc是Sun公司提供的一个技术,它从程序源代码中抽 ...

  9. Java内存泄漏分析系列之六:JVM Heap Dump(堆转储文件)的生成和MAT的使用

    原文地址:http://www.javatang.com JVM Heap Dump(堆转储文件)的生成 正如Thread Dump文件记录了当时JVM中线程运行的情况一样,Heap Dump记录了J ...

随机推荐

  1. BZOJ的两道osu概率DP easy与osu

    坑 http://blog.csdn.net/CreationAugust/article/details/49516415 http://blog.csdn.net/braketbn/article ...

  2. js cookie的封装和调用

    <script> function setCookie(cname,cvalue,exdays){ var d = new Date(); d.setTime(d.getTime()+(e ...

  3. Python Turtle

    之前对这个turtle这个模块不了解,觉得没什么意思,最近试了一下发现不错,来点最简单的.写的时候深刻感受到自己智商是个硬伤,算角度都算了半天... 图就不导了吧,懒癌晚期... import tur ...

  4. 【WEB】一个简单的WEB服务器

    WEB 服务器如何工作的?   HTTP(HyperText Transfer Protocol)是一套计算机通过网络进行通信的规则.计算机专家设计出HTTP,使HTTP客户(如Web浏览器)能够从H ...

  5. [SE0]简单的搜索引擎原理

    1.简单了解搜索引擎收录的原理  包括baidu. google .yahoo 在内的各大搜索引擎在内基本上搜录网站的原理大致相同(除了国内某些网站 网1新 l 等采取人工登记的办法),搜索引擎都是采 ...

  6. HDU Cow Sorting (树状数组)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2838 Cow Sorting Problem Description Sherlock's N (1  ...

  7. Mac 终端 Linux 命令总结(简单命令)

    目录操作 命令名 功能描述 使用举例 mkdir 创建一个目录 mkdir dirname rmdir 删除一个目录 rmdir dirname mvdir 移动或重命名一个目录 mvdir dir1 ...

  8. Openssl生成证书三板斧

    证书创建三步曲: 一.密钥文件 二.请求文 三.根证书签名 最后看需要是否合并证书文件 1. 创立根证书密钥文件(自己做CA)root.key: [kk@test ~]$ openssl genrsa ...

  9. Android屏幕适配笔记

    1.限定符 为了适配不同屏幕大小的android手机或android平板,有时候就需要利用限定符来为不同的屏幕设定不同的布局文件,在一般情况下我们都是在layout文件夹下为某个活动准备一个默认的布局 ...

  10. java并发编程(十七)Executor框架和线程池

    转载请注明出处:http://blog.csdn.net/ns_code/article/details/17465497   Executor框架简介 在Java 5之后,并发编程引入了一堆新的启动 ...