R 语言学习教程,从入门到精通,R 数据类型(6)

1、R 数据类型

数据类型指的是用于声明不同类型的变量或函数的一个广泛的系统。
变量的类型决定了变量存储占用的空间,以及如何解释存储的位模式。
R 语言中的最基本数据类型主要有三种:
数字
逻辑
文本
数字常量主要有两种:
在这里插入图片描述
逻辑类型在许多其他编程语言中常称为布尔型(Boolean),常量值只有 TRUE 和 FALSE。
注意:R 语言区分大小写,true 或 True 不能代表 TRUE。
最直观的数据类型就是文本类型。文本就是其它语言中常出现的字符串(String),常量用双引号包含。在 R 语言中,文本常量既可以用单引号包含,也可以用双引号包含,例如:

> 'nhooo' == "nhooo"
[1] TRUE

有关于 R 语言的变量定义,并不像一些强类型语言中的语法规则,需要专门为变量设置名称和数据类型,每当在 R 中使用赋值运算符时,实际上就是定义了一个新的变量:

a = 1
b <- TRUE
b = "abc"

按对象类型来分是以下 6 种(后面会详细介绍这几种类型):
向量(vector)
列表(list)
矩阵(matrix)
数组(array)
因子(factor)
数据框(data.frame)
在这里插入图片描述

1.1、向量

向量(Vector)在 Java、Rust、C# 这些专门编程的的语言的标准库里往往会提供,这是因为向量在数学运算中是不可或缺的工具——我们最常见的向量是二维向量,这种向量在平面坐标系中必然会用到。
向量从数据结构上看就是一个线性表,可以看成一个数组。
R 语言中向量作为一种类型存在可以让向量的操作变得更加容易:

> a = c(3, 4)
> b = c(5, 0)
> a + b
[1] 8 4
>

c() 是一个创造向量的函数。
这里把两个二维向量相加,得到一个新的二维向量 (8, 4)。如果将一个二维向量和三维向量做运算,将失去数学意义,虽然不会停止运行,但会被警告。
我建议大家从习惯上杜绝这种情况的出现。
向量中的每一个元素可以通过下标单独取出:

> a = c(10, 20, 30, 40, 50)
> a[2]
[1] 20

注意:R 语言中的"下标"不代表偏移量,而代表第几个,也就是说是从 1 开始的!
R 也可以方便的取出向量的一部分:

> a[1:4] # 取出第 1 到 4 项,包含第 1 和第 4 项
[1] 10 20 30 40
> a[c(1, 3, 5)] # 取出第 1, 3, 5 项
[1] 10 30 50
> a[c(-1, -5)] # 去掉第 1 和第 5 项
[1] 20 30 40

这三种部分取出方法是最常用的。
向量支持标量计算:

> c(1.1, 1.2, 1.3) - 0.5
[1] 0.6 0.7 0.8
> a = c(1,2)
> a ^ 2
[1] 1 4

之前讲述的常用的数学运算函数,如 sqrt 、exp 等,同样可以用于对向量作标量运算。
"向量"作为线性表结构,应该具备一些常用的线性表处理函数,R 确实具备这些函数:
向量排序:

> a = c(1, 3, 5, 2, 4, 6)
> sort(a)
[1] 1 2 3 4 5 6
> rev(a)
[1] 6 4 2 5 3 1
> order(a)
[1] 1 4 2 5 3 6
> a[order(a)]
[1] 1 2 3 4 5 6

order() 函数返回的是一个向量排序之后的下标向量。
向量统计
R 中有十分完整的统计学函数:
在这里插入图片描述
向量统计示例:

> sum(1:5)
[1] 15
> sd(1:5)
[1] 1.581139
> range(1:5)
[1] 1 5

向量生成
向量的生成可以用 c() 函数生成,也可以用 min:max 运算符生成连续的序列。
如果想生成有间隙的等差数列,可以用 seq 函数:

> seq(1, 9, 2)
[1] 1 3 5 7 9

seq 还可以生成从 m 到 n 的等差数列,只需要指定 m, n 以及数列的长度:

> seq(0, 1, length.out=3)
[1] 0.0 0.5 1.0

rep 是 repeat(重复)的意思,可以用于产生重复出现的数字序列:

> rep(0, 5)
[1] 0 0 0 0 0

向量中常会用到 NA 和 NULL ,这里介绍一下这两个词语与区别:
NA 代表的是"缺失",NULL 代表的是"不存在"。
NA 缺失就像占位符,代表这里没有一个值,但位置存在。
NULL 代表的就是数据不存在。
示例说明:

> length(c(NA, NA, NULL))
[1] 2
> c(NA, NA, NULL, NA)
[1] NA NA NA

很显然, NULL 在向量中没有任何意义。

1.2、逻辑型

逻辑向量主要用于向量的逻辑运算,例如:

> c(1, 2, 3) > 2
[1] FALSE FALSE  TRUE

which 函数是十分常见的逻辑型向量处理函数,可以用于筛选我们需要的数据的下标:

> a = c(1, 2, 3)
> b = a > 2
> print(b)
[1] FALSE FALSE  TRUE
> which(b)
[1] 3

例如我们需要从一个线性表中筛选大于等于 60 且小于 70 的数据:

> vector = c(10, 40, 78, 64, 53, 62, 69, 70)
> print(vector[which(vector >= 60 & vector < 70)])
[1] 64 62 69

类似的函数还有 all 和 any:

> all(c(TRUE, TRUE, TRUE))
[1] TRUE
> all(c(TRUE, TRUE, FALSE))
[1] FALSE
> any(c(TRUE, FALSE, FALSE))
[1] TRUE
> any(c(FALSE, FALSE, FALSE))
[1] FALSE

all() 用于检查逻辑向量是否全部为 TRUE,any() 用于检查逻辑向量是否含有 TRUE。

1.3、字符串

字符串数据类型本身并不复杂,这里注重介绍字符串的操作函数:

> toupper("Nhooo") # 转换为大写
[1] "nhooo"
> tolower("Nhooo") # 转换为小写
[1] "nhooo"
> nchar("中文", type="bytes") # 统计字节长度
[1] 4
> nchar("中文", type="char") # 总计字符数量
[1] 2
> substr("123456789", 1, 5) # 截取字符串,从 1 到 5
[1] "12345"
> substring("1234567890", 5) # 截取字符串,从 5 到结束
[1] "567890"
> as.numeric("12") # 将字符串转换为数字
[1] 12
> as.character(12.34) # 将数字转换为字符串
[1] "12.34"
> strsplit("2019;10;1", ";") # 分隔符拆分字符串
[[1]]
[1] "2019" "10"   "1"
> gsub("/", "-", "2019/10/1") # 替换字符串
[1] "2019-10-1"

在 Windows 计算机上实现,使用的是 GBK 编码标准,所以一个中文字符是两个字节,如果在 UTF-8 编码的计算机上运行,单个中文字符的字节长度应该是 3。
R 支持 perl 语言格式的正则表达式:

> gsub("[[:alpha:]]+", "$", "Two words")
[1] "$ $"

更多字符串内容参考:R 语言字符串介绍。

1.4、矩阵

R 语言为线性代数的研究提供了矩阵类型,这种数据结构很类似于其它语言中的二维数组,但 R 提供了语言级的矩阵运算支持。
首先看看矩阵的生成:

> vector=c(1, 2, 3, 4, 5, 6)
> matrix(vector, 2, 3)[,1] [,2] [,3]
[1,]    1    3    5
[2,]    2    4    6

矩阵初始化内容是由一个向量来传递的,其次要表达一个矩阵有几行、有几列。
向量中的值会一列一列的填充到矩阵中。如果想按行填充,需要指定 byrow 属性:

> matrix(vector, 2, 3, byrow=TRUE)[,1] [,2] [,3]
[1,]    1    2    3
[2,]    4    5    6

矩阵中的每一个值都可以被直接访问:

> m1 = matrix(vector, 2, 3, byrow=TRUE)
> m1[1,1] # 第 1 行 第 1 列 
[1] 1
> m1[1,3] # 第 1 行 第 3 列
[1] 3

R 中的矩阵的每一个列和每一行都可以设定名称,这个过程通过字符串向量批量完成:

> colnames(m1) = c("x", "y", "z")
> rownames(m1) = c("a", "b")
> m1x y z
a 1 2 3
b 4 5 6
> m1["a", ]
x y z 
1 2 3

矩阵的四则运算与向量基本一致,既可以与标量做运算,也可以与同规模的矩阵做对应位置的运算。

矩阵乘法运算:
在这里插入图片描述

> m1 = matrix(c(1, 2), 1, 2)
> m2 = matrix(c(3, 4), 2, 1)
> m1 %*% m2[,1]
[1,]   11

逆矩阵:

在这里插入图片描述

> A = matrix(c(1, 3, 2, 4), 2, 2)
> solve(A)[,1] [,2]
[1,] -2.0  1.0
[2,]  1.5 -0.5

apply() 函数可以将矩阵的每一行或每一列当作向量来进行操作:

> (A = matrix(c(1, 3, 2, 4), 2, 2))[,1] [,2]
[1,]    1    2
[2,]    3    4
> apply(A, 1, sum) # 第二个参数为 1 按行操作,用 sum() 函数
[1] 3 7
> apply(A, 2, sum) # 第二个参数为 2 按列操作
[1] 4 6

更多矩阵内容参考:R 矩阵。


http://www.ppmy.cn/news/1507510.html

相关文章

Python知识点:使用Transformers进行预训练语言模型应用

使用Transformers库&#xff08;Hugging Face提供&#xff09;进行预训练语言模型的应用涉及几个步骤&#xff1a;安装库、加载预训练模型、进行文本生成或分类任务。以下是一个详细的示例流程。 安装依赖 首先&#xff0c;确保你安装了Transformers和其他必要的库&#xff1…

从数据分析到智能生产:AI在工业中的应用与未来

导语 | 人工智能技术的迅猛发展&#xff0c;正在引领第四次工业革命悄然而至。尽管 AI 技术在工业领域的部署仍有诸多难题亟待解决&#xff0c;但这并不能阻挡历史趋势的车轮滚滚向前&#xff0c;AI 正在为工业领域带来新的变革。今天&#xff0c;我们特邀了上海腾展长融董事 &…

iOS ------ 事件响应链

响应者链 响应者链是由一系列链接在一起的响应者&#xff08;UIResponser之类&#xff1a;UIApplication&#xff0c;UIViewController&#xff0c;UIView&#xff09;注组成的。一般情况下&#xff0c;一条响应链开始于第一响应者&#xff0c;结束于application对象。如果一个…

【生成式人工智能-七-大型语言模型的可解释性】

大型语言模型的可解释性 语言模型是如何工作的1.把文字变成Token2.将Token表示成向量3.考虑上下文Attention4.编码器和解码器 语言模型无法解释体现在那些方面&#xff1f;语言模型通过什么方法可以获得解释性通过语言模型的神经网络进行分析找出哪些是影响输出的关键输入分析a…

某永PM2项目管理系统ExcelIn接口任意文件上传漏洞复现 [附POC]

文章目录 某永PM2项目管理系统ExcelIn接口任意文件上传漏洞复现 [附POC]0x01 前言0x02 漏洞描述0x03 影响版本0x04 漏洞环境0x05 漏洞复现1.访问漏洞环境2.构造POC3.复现某永PM2项目管理系统ExcelIn接口任意文件上传漏洞复现 [附POC] 0x01 前言 免责声明:请勿利用文章内的相…

cpp笔记07:STL

STL 基本概念 STL&#xff08;Standard Template Library&#xff0c;标准模板库&#xff09; STL从广义上分为&#xff1a;容器&#xff08;container&#xff09;算法&#xff08;algorithm&#xff09;迭代器&#xff08;iterator&#xff09; 容器和算法之间通过迭代器…

Postgresql数据库密码忘记的解决方法

如果你忘记了PostgreSQL数据库的密码&#xff0c;可以通过以下方法重置密码&#xff1a; 方法一&#xff1a;修改 pg_hba.conf 文件 找到 pg_hba.conf 文件&#xff1a; 这个文件通常位于 PostgreSQL 数据目录中。你可以通过以下命令找到该文件的位置&#xff1a; 复制代码 …

【前端】NodeJS:NodeJS模块化

文章目录 1 NodeJS模块化1.1 模块化与模块1.2 模块化项目1.3 模块化好处 2 模块暴露数据2.1 模块初体验2.2 暴露数据 3 导入&#xff08;引入&#xff09;模块4 导入模块的基本流程5 CommonJS规范 1 NodeJS模块化 1.1 模块化与模块 将一个复杂的程序文件依据一定规则&#xf…

leetcode数论(836. 矩形重叠)

前言 经过前期的基础训练以及部分实战练习&#xff0c;粗略掌握了各种题型的解题思路。现阶段开始专项练习。 数论包含最大公约数(>2个数)、最大公约数性质、最小公倍数、区间范围质因素计数(最下间隔)、质因素分解、判断质数、平方根、立方根、互质、同余等等。 描述 矩…

RK3399平台开发系列讲解(内核入门篇)module_init 的加载过程

🚀返回专栏总目录 文章目录 沉淀、分享、成长,让自己和他人都能有所收获!😄 📢本文要研究的内容为编译进内核的驱动系统是如何运行的? 在驱动程序中,module_init 宏定义了驱动的入口函数,在模块加载时被内核自动调用, 该宏定义在内核源码目录下的“include/linux/…

rabbitmq出现Management API returned status code 500 -

我们在使用rabbitMq点击交换机时会发现提示以下错误&#xff1a; 解决方案&#xff1a; 1、进入容器中 docker exec -it rabbitmq的镜像id /bin/bash2、cd到目录/etc/rabbitmq/conf.d/ cd /etc/rabbitmq/conf.d/ 3、执行该命令 echo management_agent.disable_metrics_co…

【C++ 面试 - 基础题】每日 3 题(九)

✍个人博客&#xff1a;Pandaconda-CSDN博客 &#x1f4e3;专栏地址&#xff1a;http://t.csdnimg.cn/fYaBd &#x1f4da;专栏简介&#xff1a;在这个专栏中&#xff0c;我将会分享 C 面试中常见的面试题给大家~ ❤️如果有收获的话&#xff0c;欢迎点赞&#x1f44d;收藏&…

React 条件判断

在 React 中&#xff0c;可以通过 JavaScript 的条件语句来动态渲染组件或元素。 以下是几种常用的在 React 中处理条件渲染的方法&#xff1a; 1. 使用 if 语句 在 render 方法或函数组件的返回值中使用 if 语句来决定渲染内容。 实例 import React from react; import R…

使用线上电子签合同靠谱吗?被国家认可的8款

盘点国内外安全靠谱的8大电子签合同工具&#xff1a;E签宝、上上签、法大大、DocuSign、腾讯电子签、爱签、Adobe Acrobat Sign、契约锁。 在互联网金融快速发展的今天&#xff0c;电子签合同已经成为新常态&#xff0c;它不仅简化了传统的文档处理流程&#xff0c;也提高了交易…

vue的diff算法的【双端比较】策略

Vue 的 diff 算法中的双端比较策略是一种高效的节点比较方法&#xff0c;通过同时从新旧节点列表的两端进行比较&#xff0c;尽可能减少节点的移动操作&#xff0c;从而提高性能。以下是详细的步骤和解释&#xff1a; 双端比较策略的步骤 初始化指针&#xff1a; 设置四个指针…

MySQL运维-读写分离

介绍 读写分离&#xff0c;简单地说是把对数据库的读和写操作分开&#xff0c;以对应不同的数据库服务器。主数据库提供写操作&#xff0c;从数据库提供读操作&#xff0c;这样能有效地减轻单台数据库的压力 通过MyCat即可轻易实现上述功能&#xff0c;不仅可以支持MySQL&…

[Qt][QWidget]详细讲解

目录 1.概述2.QWidget核心属性1.简介2.核心属性概览 3.QWidget常用属性1.enabled2.geometry1.是什么&#xff1f;2.Window Frame的影响3.相关API4.注意 3.windowTitile4.windowIcon5.windowOpacity6.cursor8.font9.toolTip10.focusPolicy11.styleSheet 1.概述 Widget是Qt中的核…

Allegro创建Xnet操作指导

1.Analyze–Model Assigment 点击OK 3.点击是 4.选中器件&#xff0c;点击Create Model 5.点击OK 6.填写参数 点击OK&#xff0c;设置成功&#xff01;&#xff01;

C语言家教记录(三)

C语言家教记录&#xff08;二&#xff09; 导语选择语句基本运算符if条件表达式switchbreak 循环whiledofor退出循环continuebreak 空循环 总结和复习 导语 本次授课内容如下&#xff1a;选择语句、循环 辅助教材为 《C语言程序设计现代方法&#xff08;第2版&#xff09;》 …

【Pytorch实用教程】Pytorch的torch.nn模块中都有哪些函数

在PyTorch的torch.nn模块中,有许多用于构建和训练神经网络的函数和类。以下是一些主要的函数和类分类: 1. 神经网络层 (Layers) nn.Linear:全连接层nn.Conv2d:二维卷积层nn.Conv3d:三维卷积层nn.ConvTranspose2d:二维反卷积层nn.ConvTranspose3d:三维反卷积层nn.BatchN…