该功能mutate从R包"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
Run Code Online (Sandbox Code Playgroud)
这背后有什么理由,还是一个bug?
(我使用的是R 3.1.1和dplyr 0.3.0.1.)
编辑:
在github上将此问题作为问题发布后,Romain Francois会在几小时内修复它!所以,如果以上是一个问题用于devtools::install_github获取最新版本:
library(devtools)
install_github("hadley/dplyr")
Run Code Online (Sandbox Code Playgroud)
然后
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
Run Code Online (Sandbox Code Playgroud)
干得好罗曼!
Rob*_*ski 12
dplyr使用C++来执行实际mutate操作.下面 的 兔子 洞,并指出这是一个未分组突变,我们可以用我们的信赖调试注意以下几点.
debugonce(dplyr:::mutate_impl)
# Inside of mutate_impl we do:
class(dots[[2]]$expr) # which is a "call"!
Run Code Online (Sandbox Code Playgroud)
所以现在我们知道了懒惰表达式的类型.我们评估调用并注意它是一种受支持的类型(不幸的是,R的TYPEOF宏声明因素是整数 - 我们需要Rf_isFactor区分).
接下来会发生什么?我们返回了结果,我们完成了.如果你已经尝试过(df %>% mutate(y="A", z=factor(c("A","B"))))[[3]],你会知道问题确实是回收.
具体来说,C++ Gatherer对象(除了它的当前日期检查之外应该真正检查)是使用C++模板来强制创建(隐式地通过构造函数初始化 - 注意arity 2调用)而不记得携带超过因素"标签".Rf_isFactorINTSXPVector<INTSXP> ConstantGathererImpl
TLDR:在R的C++中,整数和因子在使用TYPEOF宏时具有相同的内部类型,因子是一种奇怪的边缘情况.
随意向dplyr提交拉取请求,它正在积极开发中,而且hadley和Romain都是好人.你必须在这里添加一个if语句.