有人可以解释一下。当我打电话
toy = data.frame(alpha = LETTERS, numeric = 1:26)
toy[2]
它返回数据框的第二列。它没有破坏或任何东西,但它违背了我对R中其他子集化操作的期望。例如,如果你用
做同样的事情toy2 = matrix(c(LETTERS, 1:26), nrow = 26)
toy2[2]
它返回“B”。
有什么深刻的理由吗?
答案 0 :(得分:0)
当我打字时,我意识到发生了什么。
矩阵的基础数据类型是vector,只有一个“包装”给定它有多少行/列,它存储在dim
属性中。 R
填充第一列,然后在下一个列中重新开始直到矩阵已满。当您调用toy2[2]
时,向量子集将接管,R
将查找基础数据结构的第二个元素,即“B”。
数据框的基础数据类型是列表。数据帧是矢量和因子的列表,每个矢量和因子形成数据帧的一列。当您调用toy[2]
时,列表子集将接管,R
将查找数据框底层列表的第二个元素,在本例中为numeric
列。但是,返回的值是不该元素的内容,而是作为子集到其第二个元素的数据框的基础列表。调用toy[[2]]
将返回一个数字向量。