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, ]
)可能会使密集用户(因为我现在)不一致.
有人可以解释为什么 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
。