【问题标题】:Why does 'out of bounds' indexing differ between a matrix and a data.frame?为什么矩阵和data.frame之间的“越界”索引不同?
【发布时间】:2019-04-26 03:37:41
【问题描述】:

我确定这是基本的,但我只想真正了解这里的 R 数据结构的逻辑。

如果我通过超出范围的索引对矩阵进行子集化,我会得到这个错误:

m <- matrix(data = c("foo", "bar"), nrow = 1)
m[2,]
# Error in m[2, ] : subscript out of bounds

但是,如果我对数据框执行相同操作,我会得到所有 NA

df <- data.frame(foo = "foo", bar = "bar")
df[2,]
#    foo  bar
# NA <NA> <NA>

如果我将子集放入一个不存在的数据框我会熟悉

df[, 3]
# Error in `[.data.frame`(df, , 3) : undefined columns selected

我(大致)知道数据框行很奇怪,需要小心处理,但我不太明白与上述行为的联系。

有人可以解释为什么 R 对于不存在的 df 行会以这种方式表现吗?

更新

可以肯定的是,在越界子集上给出NA正常一维向量的 R 行为:

vec <- c("foo", "bar")
vec[3]
# [1] NA

所以在某种程度上,这里的奇怪的一个矩阵子集,而不是数据帧子集,这取决于你从哪里开始。 仍然不同的 2D 子集行为(m[2, ]df[2, ])可能会让密集的用户(就像我现在一样)不一致。

【问题讨论】:

  • 关于“我(大致)知道数据帧行很奇怪,需要小心处理”,这是因为数据帧是异构的(即您可以将不同的格式存储在不同的列),因此默认情况下它们不能被视为向量,需要小心处理。就索引而言,我不确定。有趣的是找出原因
  • 与列表相同。创建一个列表l1 &lt;- list('foo', 'bar')。现在尝试以下操作:1) l1[3], 2) l1[[3]]
  • 也许原子向量或类似的原子性质的对象会产生这种特性。 is.atomic(a_matrix) 产生 TRUE 而对于列表或 data.frame,此条件不满足。

标签: r dataframe data-structures subset


【解决方案1】:

有人能解释一下为什么 R 会这样吗[?]

简短回答:不,可能不会。


更长的答案: 曾几何时,我在考虑类似的事情,并在 R-devel 上阅读了这个帖子:Definition of [[。基本上可以归结为:

[[[ 的语义似乎没有在 Reference manual 中完全指定。 [...] 我认为这些是功能,而不是错误,但我找不到它们的文档

R核心团队前成员邓肯·默多克给了一个非常好的reply

Extract 的手册页中有更多文档,但我认为它不完整。最完整的文档当然是源代码*,但它可能无法回答什么是故意的,什么是偶然的问题

正如R-devel线程中提到的,手册中唯一的描述是3.4.1 Indexing by vectors

如果i 为正且超过length(x),则对应的选择为NA

但是,这适用于“简单向量的索引”。似乎没有描述“非简单”向量的类似越界索引。再次邓肯默多克:

那么什么是简单向量?这没有明确定义,它可能应该是。

因此,似乎没有人知道您的为什么问题的答案。


另请参阅优秀 R Inferno by Patrick Burns 中的“8.2.13 下标中不存在值”,以及 Hadley's book 中的“缺失/超出范围索引”部分。


*[ subset operator 的源代码。搜索R_MSG_subs_o_b(对应于错误消息"subscript out of bounds")没有提供明显线索,为什么OOB [ 矩阵索引以及使用[[ 时会出错,而OOB [ 索引“简单向量”结果在NA

【讨论】:

    猜你喜欢
    • 2018-04-12
    • 1970-01-01
    • 2018-06-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多