dplyr动词删除自定义类和属性?

时间:2015-03-12 08:05:20

标签: r dplyr

我正在开发一个依赖于向数据框添加类和属性的包,并且希望能够使用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 ...

预计会出现这种情况吗?

我可以做些什么来解决它?

1 个答案:

答案 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