在R数据表中,max对有序因子起作用,并在分组时失败

Sun*_*Bee 7 r data.table

该功能max()在类型有序因子列上正确运行.但是,在对列进行分组时,相同的操作将失败by=.

假设我有一个data.table:

DT <- data.table(ID=rep(1:3, 3), State=sample(LETTERS[1:3], 9, replace=TRUE))
Run Code Online (Sandbox Code Playgroud)

将列转换State为有序因子:

DT[, State := factor(State, levels=LETTERS[1:3], ordered = TRUE)]
Run Code Online (Sandbox Code Playgroud)

这有效:

DT[, max(State)]
Run Code Online (Sandbox Code Playgroud)

这失败了,错误:

DT[, max(State), by="ID"]
Run Code Online (Sandbox Code Playgroud)

错误是:gmax(状态)出错:max对因子没有意义.

怎么会?

Mic*_*ico 4

这是一个错误,已在当前开发版本中修复data.table

您可以通过以下方式安装开发版本:

install.packages('data.table', type = 'source',
                 repos = 'http://Rdatatable.github.io/data.table')
Run Code Online (Sandbox Code Playgroud)

如果失败,请检查安装 wiki上的完整详细信息。

library(data.table)
# data.table 1.11.5 IN DEVELOPMENT built 2018-08-13 20:20:11 UTC; travis  Latest news: r-datatable.com
DT[ , max(State), by="ID"]
#    ID V1
# 1:  1  C
# 2:  2  C
# 3:  3  B
Run Code Online (Sandbox Code Playgroud)

对于那些在受控/生产环境中无法更新的人,您仍然可以通过运行来回避问题:

dt_optim = options(datatable.optimize = 0) 
DT[ , max(State), by="ID"]
# resetting afterwards to keep your code running as fast as possible
options(datatable.optimize = dt_optim)
Run Code Online (Sandbox Code Playgroud)

该错误来自data.table内部优化的分组框架GForce;上述解决方法会阻止此代码执行并默认为base::max.