热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

R语言学习笔记1——R语言中的基本对象

R语言,一种自由软件编程语言与操作环境,主要用于统计分析、绘图、数据挖掘。R本来是由来自新西兰奥克兰大学的RossIhaka和RobertGentleman开发(也因此称为R),现在由R开

R语言,一种自由软件编程语言与操作环境,主要用于统计分析、绘图、数据挖掘。R本来是由来自新西兰奥克兰大学的Ross Ihaka和Robert Gentleman开发(也因此称为R),现在由 R开发核心团队 负责开发。R是基于S语言的一个GNU计划项目,所以也可以当作S语言的一种实现,通常用S语言编写的代码都可以不作修改的在R环境下运行。R的语法是来自Scheme。



R的源代码可自由下载使用,亦有已编译的可执行文件版本可以下载,可在多种平台下运行,包括UNIX(也包括FreeBSD和Linux)、Windows和MacOS。R主要是以命令行操作,同时有人开发了几种图形用户界面。

R内置多种统计学及数字分析功能。R的功能也可以通过安装包(Packages,用户撰写的功能)增强。因为S的血缘,R比其他统计学或数学专用的编程语言有更强的面向对象(面向对象程序设计)功能。



R的另一强项是绘图功能,制图具有印刷的素质,也可加入数学符号。

虽然R主要用于统计分析或者开发统计相关的软件,但也有人用作矩阵计算。其分析速度可媲美专用于矩阵计算的自由软件GNU Octave和商业软件MATLAB。

可以在R-project的官网http://www.r-project.org/获取R的安装包

另外,建议安装一个R集成开发环境比如Rstudio,可以在https://www.rstudio.com/获取

R语言中的基本对象

R语言中的基本对象有:向量、矩阵、数组、数据框、列表等等。

1.R语言的向量对象

向量是用于存储数值型、字符型或逻辑型数据的一维数组。

R语言中建立一个向量的函数是c(),

例如:

c(1,2,3,4),结果是[1] 1 2 3 4

此外,也可以用c()函数建立字符向量,

例如:

c("hello", "world!"),结果是[1] "hello"  "world!"

如果传递给c()的参数既有数值又有字符串,则c()会默认将数值转化成字符串,例如:c(1.5, 'a'),结果是[1] "1.5" "a"

使用str()函数察看结果的类型,也表明结果是字符串类型的向量:

str(c(1.5,'a'))
 chr [1:2] "1.5" "a"

由此我们可以知道:同一个向量中无法混杂不同格式的数据。

tip:建议不要使用R的内置函数名,如c作为变量,以避免混淆

除了c函数,我们也可以使用冒号:创建一个规则的向量,

比如:

#创建1:6的向量,增量为1

1:6
[1] 1 2 3 4 5 6

6:1
[1] 6 5 4 3 2 1

R语言中,可以用等号或者箭头给变量赋值:

a=c(1,2,3)
a
[1] 1 2 3

b -c(1,2,3)
b
[1] 1 2 3

也可以

c(1,2,3)- b
b
[1] 1 2 3

tip:rstudio中可以用快捷键alt+- 键入箭头符号

注意:R允许使用=为对象赋值。但是这样写的R程序并不多,因为它不是标准语法,某些情况下,用等号赋值会出现问题,R程序员可能会因此取笑你。你还可以反转赋值方向。例如,rnorm(5) - x与上面的语句等价。

向量的四则运算

向量之间可以直接进行加减乘除运算:

如:

c(1,2,3,4)+c(5,6,7,8)
[1]  6  8 10 12

c(1,2,3,4)-c(5,6,7,8)
[1] -4 -4 -4 -4

c(1,2,3,4)*c(5,6,7,8)
[1] 5 12 21 32

如果是两个长度不同的向量相加,则会将短的向量重复若干次,比如下面这个例子中,后一个向量重复了一次:

c(1,2,3,4)+c(5,6)
[1]  6  8  8 10

进行不同长度向量加/减法,最好长向量的长度必须是短向量长度的整数倍,否则会出现警告:

c(1,2,3,4)+c(5,6,7)
[1]  6  8 10  9
警告信息:
In c(1, 2, 3, 4) + c(5, 6, 7) : 长的对象长度不是短的对象长度的整倍数

向量的比较

除了四则运算外,我们还可以比较两个向量的大小,产生的结果是个逻辑向量:

c(2,3,4,5) c(1,4,5,3)
[1]  TRUE FALSE FALSE  TRUE

向量元素的访问

R语言中采用方括号中的数字来访问向量中一个特定位置的元素。值得注意的是,R语言与传统编程语言如C、Java不同,其数组元素是从位置1开始的。

a - c(1,2,3,4)
a[1]
[1] 1

当然,如果我们不需要某个元素还可以这样:

a[-2]
[1] 1 3 4

第二个元素就被丢掉了,如果想丢掉多个,可以这样:

a[c(-1,-3)]
[1] 2 4

这样,第一个和第三个元素都被丢掉了。

2.R语言的矩阵对象

矩阵是一个二维数组,每个元素都拥有相同数据类型。R中使用matrix函数创建一个矩阵

matrix(data = NA, nrow = 1, ncol = 1, byrow = FALSE, dimnames = NULL)

参数中,data是矩阵的元素,nrow是行数,ncol是列数,byrow指定按行填充(TRUE)还是按列填充(FALSE),默认按列填充,dimnames指定每一维的名字。

例1:

m1 - matrix(1:20,nrow=5,ncol=4) #创建5x4的矩阵,按列填充
m1
[,1] [,2] [,3] [,4]
[1,] 1 6 11 16
[2,] 2 7 12 17
[3,] 3 8 13 18
[4,] 4 9 14 19
[5,] 5 10 15 20

例2:

cell - c(1,2,3,4)

rnames - c("R1", "R2") #行名为"R1", "R2"
cnames - c("C1", "C2") #列名为"C1", "C2"
m2 - matrix(cell, nrow=2, ncol=2, byrow=TRUE, dimnames=list(rnames, cnames)) #2x2,按行填充

m2
C1 C2
R1 1 2
R2 3 4

R语言中可以使用方括号+下标来选择矩阵中的行、列或元素。

如:

m1[1,] #m1矩阵的第一行
[1] 1 6 11 16

m1[,1] #m1矩阵的第一列
[1] 1 2 3 4 5

这样做返回的结果是一个向量,有时我们不想丢掉矩阵的格式,那么我们可以加上drop=F选项来保持返回结果的格式:

m1[,1,drop=F]
[,1]
[1,] 1
[2,] 2
[3,] 3
[4,] 4
[5,] 5

m1[3,4] #m1第3行,第4列元素
[1] 18

当然,也可以同时选择多行或者多列

m1[,c(2,3)] #同时选择第2列和第3列
[,1] [,2]
[1,] 6 11
[2,] 7 12
[3,] 8 13
[4,] 9 14
[5,] 10 15

使用dim函数可以很方便地查询矩阵的维度:

dim(m1)
[1] 5 4

3.R语言的数组对象

数组与矩阵类似,但是维度可以大于2。数组由array()函数创建,形式如下:

array(data = NA, dim = length(data), dimnames = NULL)
其中data包含了数组中的数据,dim是一个数值型向量,给出各个维度下标的最大值,而dimnames是可选的、各个维度名称的标签的列表。

例子:

dim1 - c("A1", "A2")
dim2 - c("B1", "B2", "B3")
dim3 - c("C1", "C2", "C3", "C4")
z - array(1:24, c(2,3,4), dimnames=list(dim1,dim2,dim3))
z

, , C1

B1 B2 B3
A1  1  3  5
A2  2  4  6

, , C2

B1 B2 B3
A1  7  9 11
A2  8 10 12

, , C3

B1 B2 B3
A1 13 15 17
A2 14 16 18

, , C4

B1 B2 B3
A1 19 21 23
A2 20 22 24
z[1,2,3] #A1,B2,C3
[1] 15

4.R语言的数据框对象

数据框中不同的列可以包含不同模式的数据,较矩阵来说更为一般。它与SAS,SPSS和Stata中看到的数据集类似。数据框是R中最常处理的数据结构。数据框可以用data.frame()创建:

mydata -data.frame(col1, col2, ...)

其中的列向量col1,2,...可以为任何类型。每一列的名称可由函数names指定。

例:

patientID - c(1,2,3,4)

age - c(25,34,28,52)

diabetes - c("Type1", "Type2", "Type1", "Type1")
status - c("Poor", "Improved", "Excellent", "Poor")
patientData - data.frame(patientID, age, diabetes, status)
patientData
patientID age diabetes status
1 1 25 Type1 Poor
2 2 34 Type2 Improved
3 3 28 Type1 Excellent
4 4 52 Type1 Poor

选取数据框中的数据

patientData[1:2] #选择数据框的前2列
patientID age
1 1 25
2 2 34
3 3 28
4 4 52

也可以用变量名来选择数据,如:

patientData[c("diabetes", "status")]
diabetes status
1 Type1 Poor
2 Type2 Improved
3 Type1 Excellent
4 Type1 Poor

此外,还可以用记号$来选择数据框中的特定变量,例如你想知道糖尿病类型变量diabetes和病情变量status的列联表,可以使用以下代码:

table(patientData$diabetes,

patientData$status)
Excellent Improved Poor
Type1 1 0 2
Type2 0 1 0

每次引用变量名都必须键入一次patientData显得很麻烦,可以使用函数attach()和detach()或单独使用函数with()来简化代码。

函数attach()可以将数据框添加到R的搜索路径中,R在遇到一个变量名后,将检查搜索路径中的数据框。

使用attach函数将数据框patientData加入搜索路径:

attach(patientData)
The following object(s) are masked _by_ '.GlobalEnv':

age, diabetes, patientID, status

接着就可以直接引用patientData的变量了:
age
[1] 25 34 28 52
diabetes
[1] "Type1" "Type2" "Type1" "Type1"
patientID
[1] 1 2 3 4
status
[1] "Poor" "Improved" "Excellent" "Poor"

注意:当我们环境中已经有与数据框中某个变量同名的变量时,原始变量将取得优先权。任何情况下都要当心那些告知某个对象已被屏蔽的警告。

5.R语言中的列表对象

列表是R的数据类型中最为复杂的一种,它是一些对象的有序集合。可以使用list()创建列表:

mylist - list(object1, object2,...)

其中的对象可以是上面提到的任何结构。还可以为列表中的对象命名:

mylist - list(name1=object1, name2=object2,...)

例:

g - "my first list"
h - c(25,26,15,39)
j - matrix(1:10, nrow=5)
k - c("one", "two", "three")
mylist - list(title=g, ages=h, j, k)
mylist

$title
[1] "my first list"

$ages
[1] 25 26 15 39

[[3]]
  [,1] [,2]
[1,]  1  6
[2,]  2  7
[3,]  3  8
[4,]  4  9
[5,]  5  10

[[4]]
[1] "one"  "two"  "three"

mylist[[2]] #输出第二个成分
[1] 25 26 15 39

或:

mylist[["ages"]]
[1] 25 26 15 39

由于两个原因,列表成为R中的重要数据结构。首先,列表允许以一种简单的方式组织和重新调用不相干的信息。其次,许多R函数的运行结果都是以列表的形式返回的。需要取出其中哪些成分由分析人员决定。

tip:R不提供多行注释或块注释的功能。你必须以#作为多行注释每行的开始。处于调试目的,你也可以把想让解释器忽略的代码放到语句if(FALSE){...}中。将FALSE改为TRUE即允许这快代码运行。

其他的一些注意事项:

对象名称中的句点(.)没有特殊意义。但美元符号($)却有着其他语言中句点类似的含义,即指定一个对象中的某些部分。例如,A$x是指数据框A中的变量x
将一个值赋给某个向量、矩阵、数组或列表中一个不存在的元素时,R将自动扩展这个数据结构以容纳新值。

比如:

x - c(1,2,3)
x[8] - 10
x
[1]  1  2  3 NA NA NA NA

R中没有标量。标量以单元素向量的形式出现
R中的下标不以0开始,而从1开始。
变量无法被声明。它们在首次赋值时生成。


   



推荐阅读
  • 本文深入探讨了UNIX/Linux系统中的进程间通信(IPC)机制,包括消息传递、同步和共享内存等。详细介绍了管道(Pipe)、有名管道(FIFO)、Posix和System V消息队列、互斥锁与条件变量、读写锁、信号量以及共享内存的使用方法和应用场景。 ... [详细]
  • 云屏系统基于嵌入式微系统msOS,旨在解决当前嵌入式彩屏GUI编程中硬件要求高、软件开发复杂、界面效果不佳等问题。该系统通过结合MCU和Android技术,利用Html5+JavaScript实现高效、易用的图形用户界面开发,使嵌入式开发人员能够专注于业务逻辑。 ... [详细]
  • Zookeeper面试常见问题解析
    本文详细介绍了Zookeeper中的ZAB协议、节点类型、ACL权限控制机制、角色分工、工作状态、Watch机制、常用客户端、分布式锁实现、默认通信框架以及消息广播和领导选举的流程。 ... [详细]
  • 本文介绍了JSP的基本概念、常用标签及其功能,并通过示例详细说明了如何在JSP页面中使用Java代码。 ... [详细]
  • Python 内存管理机制详解
    本文深入探讨了Python的内存管理机制,涵盖了垃圾回收、引用计数和内存池机制。通过具体示例和专业解释,帮助读者理解Python如何高效地管理和释放内存资源。 ... [详细]
  • 实用正则表达式有哪些
    小编给大家分享一下实用正则表达式有哪些,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下 ... [详细]
  • 嵌入式开发环境搭建与文件传输指南
    本文详细介绍了如何为嵌入式应用开发搭建必要的软硬件环境,并提供了通过串口和网线两种方式将文件传输到开发板的具体步骤。适合Linux开发初学者参考。 ... [详细]
  • 12月16日JavaScript变量、函数、流程、循环等***线上九期班
    12月16日JavaScript变量、函数、流程、循环等***线上九期班 ... [详细]
  • Linux环境下进程间通信:深入解析信号机制
    本文详细探讨了Linux系统中信号的生命周期,从信号生成到处理函数执行完毕的全过程,并介绍了信号编程中的注意事项和常见应用实例。通过分析信号在进程中的注册、注销及处理过程,帮助读者理解如何高效利用信号进行进程间通信。 ... [详细]
  • Java多重继承的替代方案及设计考量
    本文探讨了Java为何不支持多重继承,并深入分析了其背后的原理和替代方案。通过理解Java的设计哲学,开发者可以更好地利用接口和其他特性来实现复杂的类结构。 ... [详细]
  • java文本编辑器,java文本编辑器设计思路
    java文本编辑器,java文本编辑器设计思路 ... [详细]
  • 本文探讨了SSDP(简单服务发现协议)和WSD(Web服务发现)协议,特别是SSDP如何通过固定多播地址239.255.255.250:1900实现局域网内的服务自发现功能。文中还详细介绍了SSDP协议的关键操作类型及其应用场景。 ... [详细]
  • 探索Python编程的价值与应用
    本文探讨了学习Python的重要性和广泛的应用场景,从个人技能提升到职业发展的多个方面进行了详细解析。 ... [详细]
  • 致信息安全爱好者的成长指南
    本文旨在为信息安全爱好者提供一份详尽的成长指南,涵盖从学习心态调整到具体技能提升的各个方面。 ... [详细]
  • 本文探讨了数据挖掘技术的发展及其在大数据环境下的应用流程,重点介绍了统计学、在线分析处理、信息检索、机器学习、专家系统和模式识别等领域的最新进展。 ... [详细]
author-avatar
月夜清风XL
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有