Data.table单列排除

时间:2017-12-04 03:49:04

标签: r data.table subset

data.table

的“令人惊讶”的结果

我对这种行为感到有些惊讶:

dt <- data.table(matrix(rnorm(200), nrow = 10))
SimpleDeltas <- function(data) data[, -1] - data[, -ncol(data)]
SimpleDeltas(dt)

惊讶?你应该这样,因为我们输出中的值的大小不是我们从两个标准正态随机变量的差异中得到的,而是具有与输入数据中的列数相关的大小。

使用data.frame

进行相同的函数调用“工作”
setDF(dt)
SimpleDeltas(dt)

关于为什么data.table的子集行为不同

的推理

请注意,对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 输入作为整数或评估为整数。

0 个答案:

没有答案