为什么矩阵和data.frame之间的“越界”索引不同?

时间:2018-11-23 14:03:12

标签: r dataframe data-structures subset

我确定这是一种基本的方法,但是我只是想真的在这里了解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

因此,在某种程度上,这里的奇怪的 matrix 子设置,而不是dataframe子设置,具体取决于您从何处开始。 仍然,不同的2D子设置行为(m[2, ]df[2, ])可能会引起稠密的用户(就像我现在所说的那样)不一致。

1 个答案:

答案 0 :(得分:2)

  

有人可以解释为什么R会这样表现吗??

简短的回答:不,可能不是。


更长的答案: 曾几何时,我在考虑类似的问题,并在R-devel:Definition of [[上阅读此主题。基本上可以归结为:

  

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

R核心团队的前任成员邓肯·默多克(Duncan Murdoch)给出了一个非常不错的reply

  

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

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

  

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

但是,这适用于“简单向量的索引”。似乎没有描述针对“非简单”向量的类似的越界索引。邓肯·默多克(Duncan Murdoch):

  

那么什么是简单向量?没有明确定义,也许应该。

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


另请参见出色的R Inferno by Patrick Burns中的“ 8.2.13下标中不存在值”和Hadley's book中的“缺少/超出范围索引”部分。


* [ subset operator的源代码。搜索R_MSG_subs_o_b(对应于错误消息"subscript out of bounds")并没有明显的线索来说明为什么OOB [为矩阵建立索引以及在使用[[时给出错误,而OOB {{ 1}}对“简单向量”进行索引会产生[