我对这种行为感到有些惊讶:
dt <- data.table(matrix(rnorm(200), nrow = 10))
SimpleDeltas <- function(data) data[, -1] - data[, -ncol(data)]
SimpleDeltas(dt)
惊讶?你应该这样,因为我们输出中的值的大小不是我们从两个标准正态随机变量的差异中得到的,而是具有与输入数据中的列数相关的大小。
setDF(dt)
SimpleDeltas(dt)
请注意,对data[, -1]
的调用会选择除data.table的第一列以外的所有列。以类似的方式,我希望使用data[, -ncol(data)]
选择数据的最后一列以外的所有列。
但是,由于必须对后一个表达式进行求值,因此似乎data.table假设我们不再对子集化感兴趣,而是执行某些类型的更简单j
运算。我理解为什么会出现这种情况,但你可能会想到,如果j
表达式可用于在馈送(任意长度)整数向量时对列进行子集,那么当{j
表达式时它也应该表现相同。 1}}表达式求值为相同类型的结果...
当然,我可以使用不同的方式进行子集,例如:dt[, 2:ncol(dt)] - dt[, 1:(ncol(dt)-1)]
但这不仅更加冗长和丑陋,而且还涉及创建长度与数据中的列数成比例的临时向量,似乎没必要。
编辑:在常见问题解答中偶然发现这条线路有点误导:
DT[ , j] where j is a single integer returns a one-column data.table, unlike DF[, j] which returns a vector by default
如果我可以鼓励,请考虑更改它以解决该行为取决于j
输入作为整数或评估为整数。