【问题标题】:NA in subsetter - Inconsistent behavior子集中的 NA - 不一致的行为
【发布时间】:2014-05-01 10:43:27
【问题描述】:

考虑以下几点:

seq(from=10,to=30)[c(4,8)]
[1] 13 17

seq(from=10,to=30)[c(NA,8)]
[1] NA 17

seq(from=10,to=30)[c(NA,NA)]
[1] NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA

对我来说,后者的结果与 R 处理其他两个示例的方式不一致,并且给我带来了相当不愉快的调试痛苦。

这可能被认为是一个错误吗?

【问题讨论】:

  • 一个错误,不。 seq(10, 30) 都不是NA[ 是一个提取函数。您尝试提取的NA 不在序列中。
  • 试试seq(from=10,to=30)[c(TRUE, FALSE)],看看你会得到什么。
  • 或者试试(10:30)[NA]看看你得到了什么。 R 处理NA 的规则非常明确,实际上是一致的。
  • 我不明白。 (10:30)[c(NA,8)] 可以解释为:“返回‘不适用’和第 8 个元素”,那么为什么“返回‘不适用’元素两次”没有返回 c(NA,NA)

标签: r


【解决方案1】:

不确定这是否是一个错误 - 我怀疑这取决于您的观点,但它是索引工作方式的一个微妙之处。快速解决方案是将您的第三个示例更改为:

seq(from=10,to=30)[as.numeric(c(NA,NA))]

原因是c(NA,NA) 是一个逻辑向量,因此使用了逻辑子集(涉及回收向量),而至少有一个非 NA 会导致向量被提升为整数向量。同样,这可以实现为:

seq(from=10,to=30)[c(NA_integer_,NA_integer_)]

如果您不熟悉索引的详细信息,请参阅 ?'['

【讨论】:

  • 这很清楚 - 我没有意识到子集向量所受的类型差异,并且一直认为 NA 是一种中性类型。非常感谢。
猜你喜欢
  • 2012-12-25
  • 2018-05-25
  • 1970-01-01
  • 2017-04-30
  • 2021-03-24
  • 1970-01-01
相关资源
最近更新 更多