我正在开发一个依赖于向数据框添加类和属性的包,并且希望能够使用dplyr
动词。
唯一的麻烦是它们似乎剥离了我添加到数据框中的类和属性。
示例
class(mtcars) <- c("new_class", class(mtcars))
attr(mtcars, "foo") <- "bar"
检查结构显示mtcars现在包含新类和属性
> mtcars %>% str
Classes ‘new_class’, ‘new_class’ and 'data.frame': 32 obs. of 11 variables:
$ mpg : num 21 21 22.8 21.4 18.7 18.1 14.3 24.4 22.8 19.2 ...
$ cyl : num 6 6 4 6 8 6 8 4 4 6 ...
$ disp: num 160 160 108 258 360 ...
$ hp : num 110 110 93 110 175 105 245 62 95 123 ...
$ drat: num 3.9 3.9 3.85 3.08 3.15 2.76 3.21 3.69 3.92 3.92 ...
$ wt : num 2.62 2.88 2.32 3.21 3.44 ...
$ qsec: num 16.5 17 18.6 19.4 17 ...
$ vs : num 0 0 1 1 0 1 0 1 1 1 ...
$ am : num 1 1 1 0 0 0 0 0 0 0 ...
$ gear: num 4 4 4 3 3 3 3 4 4 4 ...
$ carb: num 4 4 1 1 2 1 4 2 2 4 ...
- attr(*, "foo")= chr "bar"
但是当我使用filter
时,它似乎失去了类和属性。
> mtcars %>% filter(cyl == 8) %>% str
'data.frame': 14 obs. of 11 variables:
$ mpg : num 18.7 14.3 16.4 17.3 15.2 10.4 10.4 14.7 15.5 15.2 ...
$ cyl : num 8 8 8 8 8 8 8 8 8 8 ...
$ disp: num 360 360 276 276 276 ...
$ hp : num 175 245 180 180 180 205 215 230 150 150 ...
$ drat: num 3.15 3.21 3.07 3.07 3.07 2.93 3 3.23 2.76 3.15 ...
$ wt : num 3.44 3.57 4.07 3.73 3.78 ...
$ qsec: num 17 15.8 17.4 17.6 18 ...
$ vs : num 0 0 0 0 0 0 0 0 0 0 ...
$ am : num 0 0 0 0 0 0 0 0 0 0 ...
$ gear: num 3 3 3 3 3 3 3 3 3 3 ...
$ carb: num 2 4 3 3 3 4 4 4 2 2 ...
预计会出现这种情况吗?
我可以做些什么来解决它?
答案 0 :(得分:1)
filter
调用filter_
,它使用data.frame
的方法(因为new_class
没有过滤方法。filter_.data.frame
然后使用调用过滤器tbl_df
的方法,并使用as.data.frame
返回data.frame
。
dplyr:::filter_.data.frame
## function (.data, ..., .dots)
## {
## dots <- lazyeval::all_dots(.dots, ..., all_named = TRUE)
## as.data.frame(filter_(tbl_df(.data), .dots = dots))
## }
## <environment: namespace:dplyr>
对tbl_df
的强制删除了额外的类,但保留了属性foo
。
mtcars %>% tbl_df %>% str
过滤似乎忽略了属性foo
。
mtcars %>% tbl_df %>% filter(cyl == 8) %>% str