为什么dlpyr中的子集与tbl_df一起变化?

时间:2015-07-16 00:02:34

标签: r indexing dplyr

使用dplyr tbl_df数据帧进行子设置时,我发现了一些奇怪的行为。当我使用'matrix' style df[,'a']对数据框进行子集时,它会按预期返回向量。但是当我在tbl_df数据框中执行相同操作时,它会返回数据框。

我使用Iris数据集在下面复制了它。

有人可以解释为什么会发生这种情况,或者我如何解析数据帧?我需要在构建中使用dplyr和readr来处理这种行为。

library(dplyr)
data(iris)

str(iris['Sepal.Length'])
'data.frame':   150 obs. of  1 variable:
 $ Sepal.Length: num  5.1 4.9 4.7 4.6 5 5.4 4.6 5 4.4 4.9 ...

str(iris[,'Sepal.Length'])
 num [1:150] 5.1 4.9 4.7 4.6 5 5.4 4.6 5 4.4 4.9 ...

iris <- tbl_df(iris)

str(iris[,'Sepal.Length'])
Classes ‘tbl_df’ and 'data.frame':  150 obs. of  1 variable:
 $ Sepal.Length: num  5.1 4.9 4.7 4.6 5 5.4 4.6 5 4.4 4.9 ...

1 个答案:

答案 0 :(得分:5)

这是故意的。

请参阅?tbl_df

  

方法:

     

‘tbl_df’实现了两个重要的基本方法:

     

print仅打印前10行和适合的列             屏

     

‘[’永远不会简化(丢弃),因此始终返回data.frame

(强调补充)

如果你class(tbl_df(iris)),你会看到它的类是&#34; tbl_df&#34;,然后&#34; tbl&#34;,最后&#34; data.frame&#34;,所以它可能有不同的[方法,methods(class='tbl_df')确实显示[.tbl_df

(它有点像data.table包中的数据表也有不同的[方法。

修改:取消 - tbl_df,只需使用data.frame,例如data.frame(tbl_df(iris))会将tbl_df(..)转换回data.frame。