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

时间:2018-06-18 19:19:24

标签: r data.table

函数max()在类型有序因子列上正确运行。但是,当列与by=组合时,相同的操作将失败。

假设我有一个data.table:

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

将列State转换为有序因子:

DT[, State := factor(State, levels=LETTERS[1:3], ordered = TRUE)]

这有效:

DT[, max(State)]

此操作失败并显示错误:

DT[, max(State), by="ID"]

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

怎么回事?

1 个答案:

答案 0 :(得分:3)

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

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

install.packages('data.table', type = 'source',
                 repos = 'http://Rdatatable.github.io/data.table')

如果失败,请检查Installation 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

对于那些在受控/生产环境中无法更新的用户,您仍然可以通过运行以下命令来解决该问题:

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)

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