我确定这是一种基本的方法,但是我只是想真的在这里了解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, ]
)可能会引起稠密的用户(就像我现在所说的那样)不一致。
答案 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}}对“简单向量”进行索引会产生[
。