2

我正在与data.table. 从data.table对象中选择一列很容易:

> head(data.table(mtcars)[,2])
   cyl
1:   6
2:   6
3:   4
4:   6
5:   8
6:   6

但是尝试在ecdf调用中使用此语法选择列会产生错误:

> ecdf(data.table(mtcars)[,2])(data.table(mtcars)[,2])

[.data.frame(x, i)中的错误:选择了未定义的列

有人可以解释一下为什么吗?

务实地,解决此问题的一种方法是:

> ecdf(data.table(mtcars)[[2]])(data.table(mtcars)[[2]])
 [1] 0.56250 0.56250 0.34375 0.56250 1.00000 0.56250 1.00000 0.34375 0.34375 0.56250 0.56250 1.00000 1.00000 1.00000 1.00000 1.00000
[17] 1.00000 0.34375 0.34375 0.34375 0.34375 1.00000 1.00000 1.00000 1.00000 0.34375 0.34375 0.34375 1.00000 0.56250 1.00000 0.34375

但我想了解上述行为。

4

1 回答 1

1

原因在于提取。在第一种情况下,它仍然是一个 data.table,而在第二种情况下,它是一个vector

data.table(mtcars)[[2]]
#[1] 6 6 4 6 8 6 8 4 4 6 6 8 8 8 8 8 8 4 4 4 4 8 8 8 8 4 4 4 8 6 8 4

data.tabledata.frame语法略有不同。IN data.table, [, 默认使用drop = TRUE. 因此,,仅使用和选择单个列将删除维度成为vector

在data.table-faq中也提到了

为了保持一致性,当您在接受不同输入的函数中使用 data.table 时,您可以依赖 DT[...] 返回一个 data.table。您不必像在 data.frame 中那样记住包含 drop=FALSE。data.table 于 2006 年首次发布,这种与 data.frame 的差异从一开始就是一个特性。

于 2017-09-04T10:10:00.373 回答