【问题标题】:How does R treat nonexistent index values?R 如何处理不存在的索引值?
【发布时间】:2013-07-06 00:55:05
【问题描述】:

考虑这个实验:

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

我知道“只有负整数可以与零混合”是对子集的限制。我不清楚的部分是为什么oof[badoof]oof[-badoof] 都没有返回任何内容。这里的背景是我有一个函数可以搜索坏数据并将它们从数据向量中删除。我希望不必单独或通过 if/else 处理没有发现坏项目(即badoof 没有元素)的情况。上面最后一个例子,使用%in% 的例子有效,但我想知道为什么R 不接受索引“-badoof”构造。

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

【问题讨论】:

  • 一个更有效的替代方法可能是oof[if (length(badoof) &gt; 0) -badoff else TRUE]
  • @agstudy 是的,抱歉 -- 已在编辑中修复。
  • @MatthewPlourde 这会起作用,但出于强迫症的原因 :-) 我试图不使用 if/else。
  • oof[badoof]oof[-badoof] 均不返回任何内容,因为底层 C 代码正在索引向量上循环。如果索引向量的长度为零,则不执行循环并返回零长度向量。关于您的编辑,情况并非如此。 -[ 内部的解析与它在顶层的解析没有任何不同,也就是说它确实在将索引的值传递给[之前对其进行操作。
  • @JoshuaUlrich 感谢您提供信息。所以现在我知道了:-)。我将不得不发明一些可怕的代码,将 indexvalues&lt;-c(-4,-3,-2) 传递给 foo[-indexvalues] 只是为了混淆目的。

标签: r subset


【解决方案1】:

因为这个原因它不起作用:

> x <- numeric(0)
> x
numeric(0)
> -x
numeric(0)
> identical(x, -x)
[1] TRUE

IOW,对没有元素的向量求反,向量不变,因此使用向量的索引操作也将不变。

【讨论】:

  • 我得到的那部分——这似乎与R 忽略 oof[-10] 中的“10”没有问题,因为这是一个超出范围的索引值。 0 也是一个超出范围的值,但它的处理方式不同(numeric(0) 也是如此,这当然不是一个值)
  • @CarlWitthoft:我同意这很奇怪,但不一定不一致。 10 可能超出范围,但它是一个 可能 值。 0integer(0) 的索引值将永远any 向量中。所以我认为区别在于可能存在但不存在的索引值与永远不存在的索引值之间。
猜你喜欢
  • 1970-01-01
  • 2015-02-25
  • 2014-04-18
  • 1970-01-01
  • 2017-05-07
  • 1970-01-01
  • 1970-01-01
  • 2022-11-24
  • 2017-07-19
相关资源
最近更新 更多