【发布时间】: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 <- list('foo', 'bar')。现在尝试以下操作:1)l1[3], 2)l1[[3]] -
也许原子向量或类似的原子性质的对象会产生这种特性。
is.atomic(a_matrix)产生TRUE而对于列表或 data.frame,此条件不满足。
标签: r dataframe data-structures subset