在dplyr :: mutate中奇怪地回收因素 - bug或功能?

时间:2014-10-22 06:49:49

标签: r dplyr

来自R套餐的功能mutate' dplyr'对于因子具有特殊的回收功能,因为它似乎返回因子as.numeric。在以下示例中,y成为您期望的结果,而zc(1,1)

library(dplyr)
df <- data_frame(x=1:2)
glimpse(df %>% mutate(y="A", z=factor("B")))
# Variables:
# $ x (int) 1, 2
# $ y (chr) "A", "A"
# $ z (int) 1, 1

这背后有什么理由,还是一个错误?

(我使用的是R 3.1.1和dplyr 0.3.0.1。)


编辑:

在github上发布此问题后,Romain Francois会在几小时内将其修复!因此,如果上述问题,请使用devtools::install_github获取最新版本:

library(devtools)
install_github("hadley/dplyr")

然后

library(dplyr)
df <- data_frame(x=1:2)
glimpse(df %>% mutate(y="A", z=factor("B")))
# Variables:
# $ x (int) 1, 2
# $ y (chr) "A", "A"
# $ z (fctr) B, B

好工作罗曼!

1 个答案:

答案 0 :(得分:12)

dplyr使用C ++执行实际的mutate操作。 Following the rabbit hole并注意到这是ungrouped mutation,我们可以使用我们可靠的调试程序来注意以下内容。

debugonce(dplyr:::mutate_impl)
# Inside of mutate_impl we do:
class(dots[[2]]$expr) # which is a "call"!

现在我们知道了lazy expression的类型。我们eval来电notice这是supported type(不幸的是,R的TYPEOF宏声明factors are integers - 我们需要Rf_isFactor来区别对待)

接下来会发生什么?我们returned the result,我们已经完成了。如果您已经尝试(df %>% mutate(y="A", z=factor(c("A","B"))))[[3]],您就会知道问题确实是回收。

Specifically,C ++ Gatherer objectshould really正在检查Rf_isFactor以及INTSXP s上的当前日期检查)正在使用C ++模板要创建force a Vector<INTSXP> (隐式通过构造函数初始化 - 注意ConstantGathererImpl中的arity 2调用),而不记得继承因子“label”。

TLDR:在R的C ++中,当使用TYPEOF宏时,整数和因子具有相同的内部类型,而因子是一种奇怪的边缘情况。

随意向dplyr提交拉取请求,它正在积极开发中,而且hadley和Romain都是好人。您必须添加if语句here