r - data.table 1.10.0 - 为什么命名列索引值不起作用,而整数列索引值在没有 with = FALSE 的情况下起作用

标签 r data.table

我正在使用data.table 1.10.0。

# install.packages("install.load") # install in order to use the load_package function
install.load::load_package("data.table", "gsubfn", "fpCompare")

# function to convert from fractions and numeric numbers to numeric (decimal)
# Source 1 begins
to_numeric <- function(n) {
    p <- c(if (length(n) == 2) 0, as.numeric(n), 0:1)
    p[1] + p[2] / p[3]
}
# Source 1 ends

来源 1 是 Convert a character vector of mixed numbers, fractions, and integers to numeric

max_size_aggr <- 3 / 4

water_nonair <- structure(list(`Slump (in.)` = c("1 to 2", "3 to 4", "6 to 7",
"Approximate amount of entrapped air in nonair- entrained concrete (%)"), `3/8 in.` =
c(350, 385, 410, 3), `1/2 in.` = c(335, 365, 385, 2.5), `3/4 in.` = c(315, 340, 360, 2),
`1 in.` = c(300, 325, 340, 1.5), `1 1/2 in.` = c(275, 300, 315, 1), `2 in.` =
 c(260, 285, 300, 0.5), `3 in.` = c(220, 245, 270, 0.3), `6 in.` = c(190, 210, NA, 0.2)),
 .Names = c("Slump (in.)", "3/8 in.", "1/2 in.",
 "3/4 in.", "1 in.", "1 1/2 in.", "2 in.", "3 in.", "6 in."), row.names = c(NA, -4L),
 class = c("data.table", "data.frame"))

setnames(water_nonair, c("Slump (in.)", "3/8 in.", "1/2 in.", "3/4 in.", "1 in.",
"1 1/2 in.", "2 in.", "3 in.", "6 in."))

water_nonair_col_numeric <- gsub(" in.", "", colnames(water_nonair)[2:ncol(water_nonair)])

water_nonair_col_numeric <- sapply(strapplyc(water_nonair_col_numeric, "\\d+"), to_numeric)
# Source 1

新方式(data.table 1.10.0)

water_nonair_column <- which(water_nonair_col_numeric %==% max_size_aggr)+1L
# [1] 4

water_nonair[2, water_nonair_column][[1]]
# [1] 4

为什么当我调出列索引时以下可以工作,但上面的值为 4 时也不起作用?

water_nonair[2, 4][[1]]
# [1] 340

旧方法(data.table 1.9.6)

water_nonair[2, which(water_nonair_col_numeric %==% max_size_aggr)+1L, with = FALSE][[1]]
# [1] 340

1.9.8版本发布后,我在阅读了data.table消息后,从函数中删除了with = FALSE

最佳答案

v1.9.8 NEWS中的长注释3开始:

When j contains no unquoted variable names (whether column names or not), with= is now automatically set to FALSE. Thus ...

但是您的j确实包含不带引号的变量名称。事实上,它只是一个不带引号的变量名。因此该项目不适用于它。

这就是 options(datatable.WhenJisSymbolThenCallingScope=TRUE) 的用途,以便您可以尝试 future 的新功能。请再次阅读有关该内容的同一新闻。如果您设置该选项,它将按照您的预期工作。

但是请不要这样做。因为昨天我改变了它,并且在开发过程中该选项现在已经消失了。不再需要迁移时间表。新策略不需要更改代码,也不会造成任何破坏。请参阅 latest development NEWS for v1.10.1 中的新注释。为了避免重复,我不会在这里复制它们。

因此,当 j 是一个符号(即不带引号的变量名)时,您仍然需要 with=FALSE :

water_nonair[2, water_nonair_column, with=FALSE]

或者您可以使用昨天添加的 v1.10.1 中的新 .. 前缀:

water_nonair[2, ..water_nonair_column]

否则,如果 j 是一个符号,那么为了安全性、一致性和向后兼容性,它必须是列名。如果没有,您现在将收到新的更有用的错误消息:

DT = data.table(a=1:3, b=4:6)
myCols = "b"
DT[,myCols]
Error in `[.data.table`(DT, , myCols) : 
  j (the 2nd argument inside [...]) is a single symbol but column name 
  'myCols' is not found. Perhaps you intended DT[,..myCols] or
  DT[,myCols,with=FALSE]. This difference to data.frame is deliberate 
  and explained in FAQ 1.1.

正如 NEWS 中提到的,我重新运行了所有使用 data.table 与 data.table v1.10.1 的 313 个 CRAN 和 Bioconductor 软件包,其中 2 个软件包确实因这一更改而中断。但这正是我们想要的,因为它们确实有一个错误(调用范围中的 j 值按字面意思返回,这不是预期的)。我已经通知了他们的维护者。这正是我们想要揭示和改进的。其他 311 个软件包均通过此更改。它不依赖于测试覆盖率(这对于许多包来说很弱)。当 j 是不是列的符号时,无论是否对结果进行测试,都会发生新错误。

关于r - data.table 1.10.0 - 为什么命名列索引值不起作用,而整数列索引值在没有 with = FALSE 的情况下起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41051890/

相关文章:

r - 将数据帧转换为带有计数的矩阵

r - 使用可能为空的参数对函数进行条件参数调用

R:尝试使用另一个 data.table 对列进行操作时,data.table 中的奇怪行为

r - 为 R 数据帧中的记录 block 创建序列号

重复具有特定值的行

r - ggplot2 绘图表作为线

r - 提取在两个或多个字段中具有重复值但在另一个字段中具有不同值的行

r - 通过 data.table 在多列上从长到宽

r - 如何加快 data.table 中的逐行操作

r - magrittr 管道中的 WOE