使用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 ...
答案 0 :(得分:5)
这是故意的。
请参阅?tbl_df
:
方法:
‘tbl_df’
实现了两个重要的基本方法:
‘[’
永远不会简化(丢弃),因此始终返回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。