data.table + ecdf - 未定义列

时间:2017-09-04 10:07:39

标签: r data.table ecdf

我正在使用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

但我想了解上述行为。

1 个答案:

答案 0 :(得分:0)

原因在于提取。在第一种情况下,它仍然是一个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语法略有不同。在data.table中,[默认使用drop = TRUE。因此,使用,并仅选择单个列会将维度删除为vector

data.table-faq

中也提到了这一点
  

为了保持一致性,以便在函数中使用data.table时   接受不同的输入,你可以依靠DT [...]返回data.table。   你不必记得像你一样包含drop = FALSE   data.frame。 data.table于2006年首次发布并且存在这种差异   到data.frame从一开始就是一个功能。