来自R套餐的功能mutate
' dplyr'对于因子具有特殊的回收功能,因为它似乎返回因子as.numeric
。在以下示例中,y
成为您期望的结果,而z
为c(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
好工作罗曼!
答案 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 object(should really正在检查Rf_isFactor
以及INTSXP
s上的当前日期检查)正在使用C ++模板要创建force a Vector<INTSXP>
(隐式通过构造函数初始化 - 注意ConstantGathererImpl
中的arity 2调用),而不记得继承因子“label”。
TLDR:在R的C ++中,当使用TYPEOF
宏时,整数和因子具有相同的内部类型,而因子是一种奇怪的边缘情况。
随意向dplyr提交拉取请求,它正在积极开发中,而且hadley和Romain都是好人。您必须添加if语句here。