R如何处理不存在的索引值?

R如何处理不存在的索引值?,r,subset,R,Subset,考虑一下这个实验: Rgames> oof<-c(6,7,8,0,10) Rgames> badoof<-vector() Rgames> oof[badoof] numeric(0) Rgames> oof[-badoof] numeric(0) Rgames> oof[-0] numeric(0) Rgames> oof[-10] [1] 6 7 8 0 10 Rgames> oof[-c(10,0)] [1] 6 7 8

考虑一下这个实验:

Rgames> oof<-c(6,7,8,0,10)
Rgames> badoof<-vector()
Rgames> oof[badoof]
numeric(0)
Rgames> oof[-badoof]
numeric(0)
Rgames> oof[-0]
numeric(0)
Rgames> oof[-10]
[1]  6  7  8  0 10
Rgames> oof[-c(10,0)]
[1]  6  7  8  0 10

Rgames> oof[!(1:length(oof)%in% c(badoof) )]
[1]  6  7  8  0 10
Rgames>oof badoof[badoof]
数字(0)
Rgames>oof[-badoof]
数字(0)
Rgames>oof[-0]
数字(0)
Rgames>oof[-10]
[1]  6  7  8  0 10
Rgames>oof[-c(10,0)]
[1]  6  7  8  0 10
Rgames>oof[!(1:长度(oof)%in%c(badoof))]
[1]  6  7  8  0 10
我知道“只有负整数可以与零混合”是子集设置的限制。我不清楚的是为什么
oof[badoof]
oof[-badoof]
都不返回任何内容。这里的背景是我有一个函数,它搜索坏数据并从数据向量中删除它们。我希望不必单独或通过if/else处理未发现不良项目的情况(即
badoof
没有元素)。上面的最后一个例子是在%中使用
%的例子,但我想知道为什么
R
不接受索引“-badoof”结构


编辑:根据Hong Ooi的回答,我也应该问:在
[]
中使用负号是否真的是一种“非”操作,而不是改变指定索引的实际值

它不起作用,因为:

> x <- numeric(0)
> x
numeric(0)
> -x
numeric(0)
> identical(x, -x)
[1] TRUE
>x
数字(0)
>-x
数字(0)
>相同(x,-x)
[1] 真的

这样,对没有元素的向量求反会使该向量保持不变,因此使用该向量的索引操作也将保持不变。

它不起作用,因为:

> x <- numeric(0)
> x
numeric(0)
> -x
numeric(0)
> identical(x, -x)
[1] TRUE
>x
数字(0)
>-x
数字(0)
>相同(x,-x)
[1] 真的

照此看来,对没有元素的向量求反会使该向量保持不变,因此使用该向量的索引操作也将保持不变。

一个更有效的替代方法可能是
oof[if(length(badoof)>0)-badoff else TRUE]
@agstudy-yep,抱歉--在编辑中修复。@matthewploord这会起作用,但出于强迫症的原因:-)我尝试不使用if/else。由于底层C代码在索引向量上循环,所以
oof[badoof]
oof[-badoof]
都不返回任何内容。如果索引向量的长度为零,则不执行循环,并返回零长度向量。关于你的编辑,事实并非如此。
-
[
内部的解析与在顶层的解析没有任何不同,也就是说,在将索引传递给
[
@JoshuaUlrich谢谢你提供的信息。现在我知道了:-)。我必须发明一些可怕的代码来传递
索引值。一个比你的工作更有效的替代方法可能是
oof[if(length(badoof)>0)-badoff else TRUE]
@agstudy是的,对不起--在编辑中修复了。@matthewPlourd这会起作用,但由于强迫症的原因:-)我正在尝试不使用if/else。两者都
oof[badoof]
oof[-badoof]
不返回任何内容,因为基础C代码在索引向量上循环。如果索引向量的长度为零,则不会执行循环并返回零长度向量。关于编辑,情况并非如此。
-
内部不会进行任何不同的分析[
比它在顶层时更高,也就是说它在传递给
[
@JoshuaUlrich谢谢你提供的信息。现在我知道了:-)。我必须发明一些可怕的代码,通过
索引值传递我得到的部分——这似乎有点不符合事实,
R
忽略oof[-10]中的“10”没有问题当这是超出范围的索引值时。
0
也是超出范围的值,但它会得到不同的处理(正如
numeric(0)
所做的一样,它当然不是一个值)@卡尔维特霍夫:我同意这很奇怪,但不一定不一致。
10
可能超出范围,但它是一个可能的值。
0
整数(0)的索引值
永远不会出现在任何向量中。因此我认为索引值可能存在,但不存在,与索引值永远不存在之间存在差异。我得到的那部分-,似乎与忽略oof[-10]中的“10”没有问题这一事实有点不一致当这是超出范围的索引值时。
0
也是超出范围的值,但它会得到不同的处理(正如
numeric(0)
所做的一样,它当然不是一个值)@CarlWitthoft:我同意这很奇怪,但不一定不一致。
10
可能超出范围,但它是一个可能的值。
0
整数(0)
的索引值永远不会出现在任何向量中。因此我认为可能存在但不存在的索引值与永远不存在的索引值之间存在差异。