2.7索引向量;选择和修改一个数据集的子集Indexvectors
一个向量的子集(subset)元素可以通过向量名后面的方括号中加入索引向量得到。如果一个表达式的结果是向量,则我们可以直接在表达式的末尾方括号中加入索引向量以得到结果向量的子向量(如果有的话)。
这种索引向量可以采用下面四种方式的任何一种。
逻辑向量。这种情况下,索引向量必须和被挑选元素的向量长度一致。向量中对应索引向量为TRUE的元素将会被选中,而那些对应FALSE的元素则被忽略。例如
y-x[!is.na(x)]
这将创建(或重建)一个含x中非缺省且次序不变的元素的对象y。注意,如果x含有缺省值,y在长度上将会比x短。同样
(x+1)[(!is.na(x))x0]-z
将创建一个对象z并且把向量x+1的值赋给它,其中要求x中对应的元素既非缺省又是正值。
正整数向量。这种情况下,索引向量必须是{1,2,...,length(x)}的子向量。索引向量中索引对应的元素将会被选中,并且在结果向量中的次序和索引向量中的次序一致。这种索引向量可以是任意长度的,结果向量的长度和索引向量完全一致。如x[6]表示x的第六个元素,此外
x[1:10]
选择x的前10个元素(我们假定length(x)长度小于10)。同样(看上去好像不可能的事情)
c(x,y)[rep(c(1,2,2,1),times=4)]
会产生一个长度为16,由x,y,y,x重复4次而构成的向量。
负整数向量。这种索引向量指定被排除的元素而不是包括进来1。因此
y-x[-(1:5)]
将x除开始五个元素外的其他元素都赋给y。
字符串向量。这可能仅仅用于一个对象可以用names属性来识别他的元素。这种情况下,名字向量的子向量可以像上面第二条提到的正整数标签一样使用。
fruit-c(5,10,1,20)
names(fruit)-c(orange,banana,apple,peach)
lunch-fruit[c(apple,orange)]
名字索引(nameindices)相比数值索引(numericindices)的好处就是容易记。该用法在后面的数据框(dataframes)操作中,优势最为明显。
索引表达式同样可以出现在赋值操作的接受端。在这种情况下,赋值操作仅仅发生在这些索引指定的向量元素中。表达式必须以vector[index_vector]的形式出现,其中向量名字可以用任何表达式代替。
被赋值的向量必须吻合索引向量的长度,特别在逻辑向量中它的长度必须和被建索引的向量长度一致。
例如
x[is.na(x)]-0
将会用0替换x中所有的缺省值,而
y[y0]--y[y0]
和下面式子等价。
y-abs(y)
Footnotes
[1]译者注:索引向量中,不可以同时出现正整数和负整数