R语言——向量

发布于:2025-03-20 ⋅ 阅读:(14) ⋅ 点赞:(0)

参考资料:学习R

1、向量

        我们可以用冒号运算符 : 来创建某个数到另一个数的数字序列,以及用c函数来拼接数值和向量,以创建更长的向量。总结如下:

        vector函数能创建一个指定类型和长度的矢量。其结果中的值可为0,FALSE,空字符串,或任何相当于“什么都没有”(nothing)的类型:

vector("numeric",5)
vector("complex",5)
vector("logical",5)
vector("character",5)
vector("list",5)

        在上例中,NULL是一个特殊的“空”值(不要与代表缺失值的NA混淆)。为方便起见,我们可以用每个类型的包装(wrapper)函数来创建矢量以节省打字时间。下面的命令与上面代码中的命令是等价的:

(1)序列

        除了冒号运算符之外,还有几个函数能创建更为通用的序列。其中,seq函数最常见,能以许多不同的方式指定序列。实际中,我们可以用三个专门的序列函数:

        seq.int可以创建一个序列,序列的范围由两个数字指定,只需两个参数,原理与冒号运算符完全相同。seq.int稍微比 : 更通用些,因为它可以指定步长。

        因为seq_len函数将创建一个从1到它的输入值的序列,所以用seq_len(5)来表达1:5有些笨拙。不过,当输入值为零时,该函数非常有用:

        seq_along创建一个从1开始、长度为其输入值的序列:

pp<-c("Peter","Piper","picked","a","peck","of","pickled","peppers")
for(i in seq_along(pp)) print(pp[i])

(2)长度

        所有向量都有一个长度,它告诉我们向量包含多少个元素。这是个非负整数,我们可以通过length函数查询这个值。缺失值也会被计入长度

        容易造成混淆的地方是字符向量。它们的长度为字符串的数目,而非每个字符串中字符数的长度。对此,我们可以使用nchar。

        我们也可以用length为向量重新分配一个长度, 不过很少这么做, 且几近意味着糟糕的代码。 例如, 如果向量的长度缩短, 那么后面的值将会被删除; 而如果长度增加, 则缺失值会添加到最后:

poincare<-c(1,0,0,0,2,0,2,0)
length(poincare)<-3
poincare
length(poincare)<-8
poincare

(3)命名

        R向量的一大特性是能给每个元素命名。通常,标记元素可使代码可读性更强。我们可以使用name=value的形式在创建向量时为其指定名称。如果元素的名称是有效的,则无需被引号括起来。我们也可以只命名向量中的某些元素而忽略其他元素;也可以在向量创建后用names函数为元素添加名字;这个names函数也可以用于获取向量的名称;如果向量中没有一个元素有名字,则names函数返回NULL。

x<-1:4
names(x)<-c("apple","banana","kiwi fruit","")
x
names(x)
names(1:4)

(4)索引向量

        通常,我们只要访问向量中的部分或个别元素。这就是所谓的索引,它用方括号[]来实现。(有人也称之为子集、下标或切片,这些术语所指相同)。R系统非常灵活,提供如下多种索引方法。

        给向量传入正数,他会返回此位置上的元素切片。它的第一个位置是1

        给向量传入负数,他会返回一个向量切片,它将包含除了这些位置以外的所有元素。

        给向量传入一个逻辑向量,它会返回一个向量切片,里面只包含索引为TRUE的元素。

        对于已命名的向量,给向量传入命名的字符向量,将会返回向量中包含这些名字的元素切片。运行代码如下:

x<-(1:5)^2
x
# 下面三个索引方法都将返回相同的值
x[c(1,3,5)]
x[c(-2,-4)]
x[c(TRUE,FALSE,TRUE,FALSE,TRUE)]
# 如果给每个元素命名,以下方法也将返回相同的值
names(x)<-c("one","two","three","four","five")
x[c("one","three","five")]
# 混合使用正负值是不允许的,会报错
x[c(-1,1)]
# 如果我们用正数或逻辑值作为下标,那么缺失索引所对应的值同样也是缺失值
x[c(1,NA,5)]
x[c(TRUE,FALSE,NA,FALSE,TRUE)]
# 对于负的下标值来说,不允许存在缺失值,会报错
x[c(-2,NA)]
# 超出范围的下标值不会报错,而是返回缺失值NA
x[6]
# 非整数的下标会默认向0舍入
x[1.9]
x[-1.9]
# 不传递任何下标值将返回整个向量
x[]
# which函数将返回逻辑向量中为TRUE的位置。
# 如果要将逻辑索引切换到整个索引中,这个函数很有用
which(x>10)
# which.min是which(min(x))的缩写
# which.max是which(max(x))的缩写
which.min(x)
which.max(x)
x[which.min(x)]
x[which(x>10)]
x[which.max(x)]

(5)向量循环和重复

        当我们对不同长度的向量做运算,结果会怎么样?

        如果我们把一个单独的数字与向量相加,则向量的每个元素都会与该数字相加;

        将两个向量相加时,R将会循环较短向量中的元素以配合较长的那个;

        如果长向量的长度不是短向量长度的倍数,则会报错;

#如果我们把一个单独的数字与向量相加,则向量的每个元素都会与该数字相加;
1:5+1
1+1:5
#将两个向量相加时,R将会循环较短向量中的元素以配合较长的那个;
1:5+1:15
#如果长向量的长度不是短向量长度的倍数,则会报错;
1:5+1:7

        

        必须强调的是,虽然我们可以在不同长度的向量之间做运算,但这并不意味着应该这样做。为向量添加一个标量值没有问题,但我们会在其他方面把自己搞晕。最好的做法是明确地创建等长度的向量,然后再对它们进行操作

        rep函数非常适合此类任务,它允许我们重复使用元素来创建矢量: