【R语言干货】认识向量
开了一个【】的专辑,从R的基础到进阶,一点点来讲解。今天这篇文章主要认识和学习R中的向量,从基础开始。
向量
一个向量是由一组相同类型的原始值构成的序列,可以是同一组数字、同一组逻辑值、同一组字符串型文本或者同一组其他类型的值,它是所有R对象的基础数据结构之一,本质上是一维数组。这里要注意的就是:单个向量中的数据必须是相同的类型(数值型、字符型或逻辑型等),不可混杂不同类型的数据。
数值向量
数值向量,即数值构成的向量,单个数值(标量数值)就是最简单的数值向量。
什么是标量?R中,没有对标量类型的正式定义,我们可以理解为只含一个元素的向量,用于保存常量(单独各种类型的值)。标量数值是数值向量的特例,它的特殊之处仅仅在于其长度为1。在其他编程语言中,存在一些标量类型,如整型、双精度型和字符串型,这些标量是构成如向量等其他容器类型的基础。
# 标量:只含一个元素的向量,用于保存常量(单独各种类型的值)
(f= 3)
(g= 'US')
(h= TRUE)
数值向量是最常用的数据类型,也几乎是所有数据分析的基础。执行组合功能的组合函数c()可用于创建向量,可以把多个向量组合成一个向量。
numeric(5) #numeric函数创建由0组成的指定长度的向量
integer(10) #integer函数创建由0组成的指定长度的向量
double(1) #double函数创建由0组成的指定长度的向量
# 执行组合功能的组合函数c可用于创建向量,可以把多个向量组合成一个向量
(a= c(1, 2, 3, 4, -5))
c(1,8,a)
# 等价于
c(1,8,c(1, 2, 3, 4, -5))
dim(a) # 返回 NULL
1:5 #运算符:创建一系列连续的整数值,等差生成等差为1或-1的向量
1.1:10
1:10
10:1
# 产生一个数值序列,更通用的方法是使用seq函数,生成等距数值序列
seq(1,10,2) #由1开始,到10结束,步长为2的序列组成的一个数值向量
seq(from = 1, to=10, length=5) #由1开始,到10结束,参数length指定序列长度为5
seq(3,length.out = 10) #由3开始,参数length.out指定序列长度为10
seq(10)
1 + 1:5 #注意运算优先级的问题
逻辑向量
逻辑向量存储一组TRUE或FALSE值,表示对一组逻辑问题的回答“是”或“否”。
TRUE
1 > 2 #逻辑问题
c(5,6) > 5 #多个比较,可以直接在问题中使用数值向量
# R将其理解为在c(5,6)和5之间依次进行元素比较的逻辑问题
c(5>5, 6>5)
c(1, 2) > c(2, 1) #两个多元素数值向量的比较
# 等价于
c(1>2, 2>1)
c(2, 3) > c(1, 2, -1, 3)
# 两个多元素数值向量的比较,只要较长向量的长度是较短向量长度的整数倍
# 对以上代码,R的运算机制是不断地循环较短的向量并进行相应位置上的比较
# 即等价于
c(2>1, 3>2, 2>-1, 3>3)
1 %in% c(1, 2, 3) #运算符判断左侧向量的每一个元素是否都包含在运算符右侧的向量中
c(1, 4) %in% c(1, 2, 3)
# 等价于
c(1 %in% c(1,2,3), 4 %in% c(1,2,3)) #%in%运算符不循环,只是迭代左侧向量中的单个元素
match(2, c(2, 1, 3)) #若前后能够匹配,返回可以匹配的值在后者中的位置
match(c(5,2), c(5, 1, 2))
match(2, c(5, 1, 3)) #若前后不能匹配,返回NA
match(c(2,6), c(5, 1, 3)) #若前后不能匹配,返回NA
match(2, c(5, 1, 3), 0) #指定前后不能匹配时的返回数值
字符向量
字符向量,即由字符串组成的向量。
# 双引号和单引号都可以用来生成字符向量,单或双引号不影响字符串本身含义
"hello, world!"
# 等价于
'hello, world!'
# 二者唯一区别在于:当字符串本身包含引号时,二者的使用不同
# 双引号内嵌套双引号,需要用反斜杠\转义字符串内部的双引号
cat("Is \"You\" a Chinese name?") #cat函数生成指定文本
# 单引号内嵌套单引号,需要用反斜杠\转义字符串内部的单引号
cat('Is \'You\' a Chinese name?')
cat('Is "You" a Chinese name?') #单引号内部可以嵌套双引号
cat("Is 'You' a Chinese name?") #双引号内部可以嵌套单引号
c("Hello", "World")
c("Hello", "World") == c('Hello', 'World') #运算符==判断两个向量中处于对等位置的值是否相等,这同样适用于字符向量
c("Hello", "World") == "Hello, World" #迭代比较
R中也有复数向量(complex vector)和原向量(raw vector)。复数向量即由复数组成的向量,如c(1+2i, 2+3i);原向量主要存储用十六进制格式表示的原始二进制数据。
构建使用向量子集
所谓构建使用向量子集,即访问向量的特定元素或其中一个子集。这里说明三种访问方法。
方法一:使用位置信息进行索引
(v1= c(1, 2, 3, 4))
v1[2] #提取第2个元素
v1[2:4] #提取第2到第4个元素
v1[-3] #提取剔除第3个元素以外的所有其他元素,方括号中使用负数表示排除相应位置上的元素
a= c(1, 3)
v1[a] #可以在方括号中放入任何一个数值向量获取相应位置的子集
v1[c(1, 2, -3)] #报错,方括号中不能同时使用正、负数
v1[3:6] #当位置信息超越向量的位置范围时,在向量中不存在元素的位置上,会返回NA表示缺失值
# R中,对包含NA的数据进行数值运算,结果都是返回NA
方法二:使用逻辑向量/逻辑标准
# 方法二:使用逻辑向量/逻辑标准
v1[c(TRUE, FALSE, TRUE, FALSE)] #逻辑向量长度与原始向量相等
v1[v1 <= 2] #筛选出所有不大于2的元素
v1[v1 ^ 2 - v1 + 1 >= 0]
# 对向量中特定子集重新赋值:
v1[2]= 0 #覆盖原值
v1
v1[2:4]= c(0, 1, 3)
v1
v1[c(TRUE, FALSE, TRUE, FALSE)]= c(3, 2) #适用于逻辑向量选择子集
v1
v1[v1 <= 2]= 0 #用0替代所有不大于2的元素
v1
# 同样,对向量中不存在位置上的元素重新赋值,不存在的位置上会返回NA作为缺失值处理
v1[10]= 8
v1
方法三:基于名称
x= c(a = 1, b = 2, c = 3) #创建向量的同时,对其中的元素命名
x
x["a"] #通过名称的字符向量,访问向量中的元素
x[c("a", "c")]
x[c("a", "a", "c")] #名称的字符向量中出现重复,返回值中也随之出现重复
names(x) #获取向量中元素的名称
names(x)= c("x", "y", "z") #更改向量中元素的名称
x["z"]
names(x)= NULL #移除向量中所有元素的名称,NULL表示对象未定义值
x
names(x)[2]= NULL #报错
names(x[2])= NULL #改名无效
x
x= c(a = 1, b = 2, c = 3)
x["d"] #访问名称不存在的元素,返回NA表示缺失值
names(x["d"]) #访问名称不存在的元素的名称,返回NA表示缺失值
x[c("a", "d")]
x= c(a = 1, b = 2, c = 3)
x["a"] #得到向量中名称为"a"的元素
x[["a"]] #[[]]得到且只能得到向量中名称为"a"的单个元素中的元素
x[[c(1, 2)]] #报错,[[]]得到且只能得到向量中单个元素中的元素
x[[-1]] #自然报错,方括号中使用负数表示排除相应位置上的元素
x= c(a = 1, b = 2)
x[[-1]] #可行,方括号中使用负数表示排除相应位置上的元素
x[[8]] #[[]]提取位置超出向量范围或对应名称不存在的元素时,报错
x[["d"]] #报错
识别、转换向量类型
# class函数用判断任意R对象的类型:
class(c(1, 2, 3)) #"numeric"
class(c(TRUE, TRUE, FALSE)) #"logical"
class(c("Hello", "World")) #"character"
# 逻辑判断:
is.numeric(c(1, 2, 3))
is.logical(c(TRUE, TRUE, FALSE))
is.character(c("Hello", "World"))
# 不同类型的向量可以被强制转换为特定类型的向量
# 如,有些数据是数值字符串,如1和20,若不进行转换处理,就无法对其进行数值运算
# 转换后,R就能够识别它们为数值数据而非字符串,这样就能对其进行数值运算了
strings= c("1", "2", "3")
class(strings) #"character"
strings + 10 #报错
numbers= as.numeric(strings) #as.numeric函数将字符向量转换为数值向量
numbers
class(numbers) #"numeric"
numbers + 10 #可行
c(1, 2) + c(2, 3) #可行
as.character(c(1, 2)) + c(2, 3) #报错
# 在实际数据分析中,我们需要事先确定好参与运算的向量类型符合规定,否则容易报错
# 字符向量转换为数值向量:
as.numeric(c("1", "2", "3", "a")) #最后一个元素不能被转换为数字,相应位置产生缺失值,其他位置完成转换
# 数值向量转换为逻辑向量:
as.logical(c(-1, 0, 1, 2)) #只有0转换为FALSE,其他所有非零数字1全部转换为TRUE
# 数值向量、逻辑向量转换为字符向量:
# 所有数据都可以表示为字符形式,每种类型的向量均可转换为字符向量
as.character(c(1, 2, 3))
as.character(c(TRUE, FALSE))
数值向量的算术运算符
数值向量的算术运算主要遵循两个原则:
对相应位置的元素进行计算
自动循环利用长度较短的向量,即循环补齐
c(1, 2, 3, 4) + 2
c(1, 2, 3) - c(2, 3, 4)
c(1, 2, 3) * c(2, 3, 4)
c(1, 2, 3) / c(2, 3, 4)
c(1, 2, 3) ^ 2
c(1, 2, 3) ^ c(2, 3, 4)
c(1, 2, 3, 14) %% 2
c(a = 1, b = 2, c = 3) + c(b = 2, c = 3, d = 4) #向量元素的名称不参与计算,且只保留左侧元素名称
c(a = 1, b = 2, 3) + c(b = 2, c = 3, d = 4)
往期精彩
统计分析,数据处理
长按二维码.关注Leosay卫统