为什么子集化数据帧行"越界"会产生所有NA行?

max*_*eld 13 r subset dataframe data-structures

我确信这是基本的,但我想在这里真正理解R数据结构的逻辑.

如果我按索引超出边界对矢量进行子集化,我会得到完全错误:

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

但是,如果我这样做数据框,我会得到所有NA:

df <- data.frame(foo = "foo", bar = "bar")
df[2,]
#    foo  bar
# NA <NA> <NA>
Run Code Online (Sandbox Code Playgroud)

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

df[, 3]
# Error in `[.data.frame`(df, , 3) : undefined columns selected
Run Code Online (Sandbox Code Playgroud)

我(大致)知道数据帧行很奇怪并且需要小心处理,但是我没有看到与上述行为的连接.

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

更新

可以肯定的是,给出NA越界子集是1D向量的正常 R行为:

vec <- c("foo", "bar")
vec[3]
# [1] NA
Run Code Online (Sandbox Code Playgroud)

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

Hen*_*rik 3

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

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


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

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

R核心团队前成员Duncan Murdoch给出了非常好的答复

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

正如 R-devel 线程中提到的,手册中唯一的描述是3.4.1 按向量索引

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

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

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

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


另请参阅Patrick Burns 撰写的优秀 R Inferno 中的“8.2.13 下标中不存在的值” ,以及Hadley 书中的“缺失/越界索引”部分。


[*子集运算符的源代码。搜索R_MSG_subs_o_b(对应于错误消息“下标越界”)没有提供明显的线索,为什么矩阵的 OOB[索引以及使用时[[给出错误,而[“简单向量”的 OOB 索引会导致NA