数据框中的奇数子集行为

时间:2014-01-08 16:30:54

标签: r dataframe subset

有人可以解释一下。当我打电话

toy = data.frame(alpha = LETTERS, numeric = 1:26)
toy[2]

它返回数据框的第二列。它没有破坏或任何东西,但它违背了我对R中其他子集化操作的期望。例如,如果你用

做同样的事情
toy2 = matrix(c(LETTERS, 1:26), nrow = 26)
toy2[2]

它返回“B”。

有什么深刻的理由吗?

1 个答案:

答案 0 :(得分:0)

当我打字时,我意识到发生了什么。

矩阵的基础数据类型是vector,只有一个“包装”给定它有多少行/列,它存储在dim属性中。 R填充第一列,然后在下一个列中重新开始直到矩阵已满。当您调用toy2[2]时,向量子集将接管,R将查找基础数据结构的第二个元素,即“B”。

数据框的基础数据类型是列表。数据帧是矢量和因子的列表,每个矢量和因子形成数据帧的一列。当您调用toy[2]时,列表子集将接管,R将查找数据框底层列表的第二个元素,在本例中为numeric列。但是,返回的值是该元素的内容,而是作为子集到其第二个元素的数据框的基础列表。调用toy[[2]]将返回一个数字向量。